第一行:模式串 `p` (长度不超过20)
第二行:目标串 `s` (长度不超过
)
保证输出的总行数不超过。
对每一个匹配子串输出 `匹配起始位置 匹配的长度`(空格分隔)一行;若无匹配输出 `-1 0`。
shopee*.com shopeemobile.com
0 16
0 起始位置,16长度
*.com shopeemobile.com
0 16 1 15 2 14 3 13 4 12 5 11 6 10 7 9 8 8 9 7 10 6 11 5 12 4
o*m shopeemobile.com
2 5 2 14 7 9 14 2
#include <bits/stdc++.h>
using namespace std;
string s, t;
set<int> S;
void DFS(int i, int j){
if(j==t.length())
S.insert(i);
if(i==s.length())
return;
if(s[i]==t[j])
DFS(i+1, j+1);
else if(t[j]=='*'){
DFS(i, j+1);
DFS(i+1, j);
DFS(i+1, j+1);
}
return;
}
int main(){
cin>>t>>s;
bool flag = false;
for(int i=0;i<s.length();i++){
if(s[i]==t[0] || t[0]=='*'){
DFS(i, 0);
if(!S.empty()){
flag = true;
for(set<int>::iterator it=S.begin();it!=S.end();it++)
if(*it>i)
cout<<i<<" "<<*it-i<<endl;
}
S.clear();
}
}
if(!flag)
cout<<-1<<" "<<0<<endl;
return 0;
} #include<iostream>
#include<vector>
using namespace std;
int Core(string &str1, string &str2, int left, int right,int start, int len)
{
int res = false;
if(str1[left] == '\0')
{
cout << start << " " << len << endl;
return true;
}
if(str1[left] != '\0' && str2[right] == '\0') return false;
//当通配字符不是*时候,判断两个个字符是否相等
if(str1[left] != '*')
{
if(str1[left] != str2[right]) return false;
else
{
res = Core(str1, str2, left+1, right+1, start, len+1);
}
}
//当通配字符是*时候,通配字符向后移动或者查找字符向后移动
else
{
//这里要注意不能用||因为一旦第一个条件成立第二个条件不会被执行
bool tem1 = Core(str1, str2, left+1, right, start, len) ;
bool tem2 = Core(str1, str2, left, right+1,start, len+1);
res = tem1||tem2;
}
return res;
}
int main()
{
string str1;
string str2;
cin >> str1 >> str2;
if(str1 == "*")
{
for(int i = 0; i < str2.size();i++)
{
for(int j = 1; j + i <= str2.size();j++)
{
cout << i << " " << j << endl;
}
}
return 0;
}
bool res = false;
for(int i = 0; i < str2.size();i++)
{
if(Core(str1, str2, 0,i,i,0)) res = true;
}
if(!res) cout << -1 << " " << 0 << endl;
return 0;
}
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Main {
private static boolean match(String matchStr, String str, int matchIdx, int idx) {
if (matchIdx == matchStr.length() && idx == str.length()) {
return true;
}
if (idx >= str.length() && matchIdx < matchStr.length() && matchStr.charAt(matchIdx) == '*') {
return match(matchStr, str, matchIdx + 1, idx);
}
if (matchIdx >= matchStr.length() || idx >= str.length()) {
return false;
}
if (matchStr.charAt(matchIdx) != '*' && matchStr.charAt(matchIdx) != str.charAt(idx)) {
return false;
}
boolean flag = false;
if (matchStr.charAt(matchIdx) == '*') {
flag = match(matchStr, str, matchIdx + 1, idx) || match(matchStr, str, matchIdx, idx + 1);
}
if (matchStr.charAt(matchIdx) == str.charAt(idx)) {
flag |= match(matchStr, str, matchIdx + 1, idx + 1);
}
return flag;
}
private static List<Integer[]> getMatchPosAndLen(String matchStr, String str) {
List<Integer[]> ans = new ArrayList<>();
for (int i = 0; i < str.length(); ++i) {
if (matchStr.charAt(0) != '*' && matchStr.charAt(0) != str.charAt(i)) {
continue;
}
for (int j = i; j < str.length(); ++j) {
if (matchStr.charAt(matchStr.length() - 1) != '*' && matchStr.charAt(matchStr.length() - 1) != str.charAt(j)) {
continue;
}
if (match(matchStr, str.substring(i, j + 1), 0, 0)) {
ans.add(new Integer[]{i, j - i + 1});
}
}
}
if (ans.size() == 0) {
ans.add(new Integer[]{-1, 0});
}
return ans;
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String str = in.next();
List<Integer[]> list = getMatchPosAndLen(matchStr, str);
for (Integer[] arr : list) {
System.out.println(arr[0] + " " + arr[1]);
}
}
} 暴力加略微剪枝,过了!
a = input()
panduan = list(a.split('*'))
b = input()
a,c,lenb = a.replace('*','.*'),[],len(b)
for i in range(len(panduan)):
if not panduan[i] in b:
print('-1 0')
quit()
from re import match
for i in range(lenb):
for j in range(i+1,lenb+1):
k = b[i:j]
d = f'{i} {j-i}'
kd = [k,d]
c.append(kd)
for i in c:
pi = match(a,i[0])
if pi:
ans = pi.group()
if ans == i[0]:
print(i[1]) 首先将a以*号分割成为几部分,如果这几部分有任意一部分不在b中,那么就直接输出-1 0并且quit,可以直接跳出整个程序,就没有必要再写else了,然后将a中的*换成一个点加*号,这是很重要的正则表达式,从re中导入match,取出b中所有的连续子串,这个方法是通用必会的,同时,将对应要输出的字符串提前加入到列表中,统一存到列表c中,然后对所有的连续子串,我们使用match去匹配,这里match的返回值有点奇怪,有可能为none,所以必须要使用if条件句,并且使用group去取出最后匹配的值,因为这里已经是分割成所有子串了,所以需要严格匹配子串本身,如果取出的值等于子串本身,我们直接输出之前准备好的字符串即可 #include<iostream>
#include<stdio.h>
#include<string>
#include<cstring>
#include<vector>
#include<algorithm>
#include<math.h>
using namespace std;
bool check(string p,string s) {
int len1=p.size();
int len2=s.size();
vector<vector<bool>> dp(len1+1,vector<bool>(len2+1,false)); //dp[i][j]表示p[0...i-1]和s[0...j-1]是否匹配
dp[0][0]=true;
for(int i=1;i<=len1;++i) {
if(p[i-1]=='*')
dp[i][0]=dp[i-1][0];
}
for(int i=1;i<=len1;++i) {
for(int j=1;j<=len2;++j) {
if(p[i-1]==s[j-1]) {
dp[i][j]=dp[i-1][j-1];
} else {
if(p[i-1]=='*') {
dp[i][j]=dp[i-1][j] || dp[i][j-1];
} else {
dp[i][j]=false;
}
}
}
}
return dp[len1][len2];
}
int main()
{
string p;
cin>>p;
string s;
cin>>s;
if(p.size()==0) {
cout<<"-1 0"<<endl;
return 0;
}
int len=s.size();
if(p=="*") {
for(int i=0;i<len;++i) {
for(int j=1;i+j<=len;++j) {
cout<<i<<" "<<j<<endl;
}
}
return 0;
}
bool flag=false;
for(int i=0;i<len;++i) {
if(s[i]!=p[0] && p[0]!='*')
continue;
for(int j=1;i+j<=len;++j) {
if(check(p,s.substr(i,j))) {
cout<<i<<" "<<j<<endl;
flag=true;
}
}
}
if(!flag)
cout<<"-1 0"<<endl;
return 0;
} package main
import (
"bufio"
"fmt"
"os"
"sort"
"strconv"
)
var pStr, sStr string
var endPositions map[int]bool
// dfs: 从 sIdx 和 pIdx 开始尝试匹配
func dfs(sIdx, pIdx int) {
if pIdx == len(pStr) {
endPositions[sIdx] = true
return
}
if sIdx == len(sStr) {
return
}
if pStr[pIdx] == sStr[sIdx] {
dfs(sIdx+1, pIdx+1)
} else if pStr[pIdx] == '*' {
// 三种情况:
// 1. '*' 匹配空(跳过 '*')
dfs(sIdx, pIdx+1)
// 2. '*' 匹配当前字符,并继续用 '*' 匹配后续
dfs(sIdx+1, pIdx)
// 3. '*' 仅匹配当前字符
dfs(sIdx+1, pIdx+1)
}
}
func main() {
scanner := bufio.NewScanner(os.Stdin)
scanner.Split(bufio.ScanWords)
scanner.Scan()
pStr = scanner.Text()
scanner.Scan()
sStr = scanner.Text()
foundMatch := false
// 存储结果:起始位置 → 长度列表
type Result struct {
Start, Length int
}
var results []Result
for i := 0; i < len(sStr); i++ {
// 只有首字符匹配,或模式首字符是 '*' 才尝试匹配
if pStr[0] == '*' ||
pStr[0] == sStr[i] {
endPositions = make(map[int]bool) // 清空上次结果
dfs(i, 0)
if len(endPositions) > 0 {
foundMatch = true
// 收集所有有效的匹配(长度 > 0)
for endPos := range endPositions {
if endPos > i {
results = append(results, Result{Start: i, Length: endPos - i})
}
}
}
}
}
// 去重并排序:按起始位置,再按长度
uniqueResults := make(map[string]bool)
var finalResults []Result
for _, r := range results {
key := strconv.Itoa(r.Start) + "," + strconv.Itoa(r.Length)
if !uniqueResults[key] {
uniqueResults[key] = true
finalResults = append(finalResults, r)
}
}
// 排序输出
sort.Slice(finalResults, func(i, j int) bool {
if finalResults[i].Start == finalResults[j].Start {
return finalResults[i].Length < finalResults[j].Length
}
return finalResults[i].Start < finalResults[j].Start
})
// 输出结果
if foundMatch && len(finalResults) > 0 {
for _, r := range finalResults {
fmt.Printf("%d %d\n", r.Start, r.Length)
}
} else {
fmt.Println("-1 0")
}
}
#include <string>
#include <iostream>
#include <set> //需要使用有序的集合
using namespace std;
set<int> matchedPos;
void ExgrexMatch(string& pattern, int pos1, string& str, int pos2) {
if(pos1 == pattern.length()) { //str[j:pos2) 是匹配的
matchedPos.insert(pos2);
}
if(pos2 == str.length()) { //str结束
return;
}
if(pattern[pos1] == str[pos2]) { //匹配1个
ExgrexMatch(pattern, pos1+1, str, pos2+1);
}
else if(pattern[pos1] == '*') {
ExgrexMatch(pattern, pos1+1, str, pos2); //*匹配0个字符
ExgrexMatch(pattern, pos1+1, str, pos2+1); //*匹配1个字符
ExgrexMatch(pattern, pos1, str, pos2+1); //*匹配多个字符
}
else { // pattern[pos1] != '*' && pattern[pos1] != str[pos2]
return; //此路不匹配
}
}
int main() {
string pattern, str;
cin >> pattern >> str;
int len1 = pattern.length();
int len2 = str.length();
bool someMatched = false;
for(int j = 0; j < len2; j++) {
if(str[j] == pattern[0] || pattern[0] == '*') {
ExgrexMatch(pattern, 0, str, j);
if(!matchedPos.empty()) {
someMatched = true;
for(auto pos : matchedPos) {
if(pos > j) { //*匹配0个字符的时候,pos-j为0,
//此时不应输出
cout << j << " " << pos - j << endl;
}
}
matchedPos.clear(); //清除开始下一轮
}
}
}
if(!someMatched) {
cout << -1 << " " << 0 << endl;
}
return 0;
} import java.util.*;
public class Main{
public static boolean check(String str2,String str1){
boolean[][] dp=new boolean[str2.length()+1][str1.length()+1];
int rows=dp.length;
int cols=dp[0].length;
dp[0][0]=true;
for(int i=1;i<cols;i++){
if(str1.charAt(i-1)=='*'){
dp[0][i]=dp[0][i-1];
}
}
//这个几乎就是leetcode原题了,但是leetcode题太多了所以没找到
// 剑指offer第52题的思路也是一样的
for(int i=1;i<rows;i++){
for(int j=1;j<cols;j++){
if(str2.charAt(i-1)==str1.charAt(j-1)){
dp[i][j]=dp[i-1][j-1];
}else if(str1.charAt(j-1)=='*'){
dp[i][j]=dp[i-1][j]||dp[i][j-1];
}
}
}
return dp[rows-1][cols-1];
}
public static void main(String[]args){
Scanner sc=new Scanner(System.in);
String str1="";
String str2="";
while(sc.hasNext()){
str1=sc.next();
str2=sc.next();
}
//TreeSet<int[]> res=new TreeSet<>((a,b)->(a[0]==b[0]?a[1]-b[1]:a[0]-b[0]));
int len2=str2.length();
int len1=str1.length();
int count=0;
if(len1>=1){
for(int i=0;i<len2;i++){
for(int j=i;j<len2;j++){
if(str2.charAt(i)==str1.charAt(0)&&str2.charAt(j)==str1.charAt(len1-1)){
if(check(str2.substring(i,j+1),str1)){
StringBuilder s=new StringBuilder();
s.append(i);
s.append(" ");
s.append(j-i+1);
System.out.println(s.toString());
count++;
}
}else if(str1.charAt(0)=='*'&&(str2.charAt(j)==str1.charAt(len1-1)||len1==1)){
if(check(str2.substring(i,j+1),str1)){
StringBuilder s=new StringBuilder();
s.append(i);
s.append(" ");
s.append(j-i+1);
System.out.println(s.toString());
count++;
}
}else if(str1.charAt(len1-1)=='*'&&(str2.charAt(i)==str1.charAt(0)||len1==1)){
if(check(str2.substring(i,j+1),str1)){
StringBuilder s=new StringBuilder();
s.append(i);
s.append(" ");
s.append(j-i+1);
System.out.println(s.toString());
count++;
}
}
}
}
}
if(count==0) {
System.out.print("-1 0");
}
/*if(res.size()<=0){
System.out.print("-1 0");
}else{
for(int[] temp:res){
for(int j=0;j<temp.length;j++){
if(j==temp.length-1){
System.out.print(temp[j]);
break;
}
System.out.print(temp[j]+" ");
}
System.out.print("\n");
}
}
*/
}
} Scanner scanner=new Scanner(System.in); String str1=scanner.nextLine(); String str2=scanner.nextLine(); String[] list = str1.split("\\*"); String s1=list[0]; String s2=list[1]; int begin=str2.indexOf(s1); while(begin!=-1){ int end=str2.indexOf(s2,begin); while(end!=-1){ System.out.println(begin+" "+(end+s2.length()-begin)); end=str2.indexOf(s2,end+1); } begin=str2.indexOf(s1,begin+1); }
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
/**
* 实现字通配符*
*
* @author WU Jiahui
* @date 2020/07/28 11:24
*/
public class Main {
static boolean found = false;
public static void search(char[] target, char[] text, int begin, int targetCur, int textCur, Set<Integer> set) {
if (targetCur == target.length
|| (textCur == text.length && targetCur == (target.length - 1) && target[targetCur] == '*')) {
found = true;
if (!set.contains(textCur - begin) && textCur != begin) {
set.add(textCur - begin);
System.out.printf("%d %d\n", begin, textCur - begin);
}
return;
}
if (textCur == text.length) {
return;
}
if (target[targetCur] == '*') {
search(target, text, begin, targetCur + 1, textCur, set);
search(target, text, begin, targetCur + 1, textCur + 1, set);
search(target, text, begin, targetCur, textCur + 1, set);
} else if (target[targetCur] == text[textCur]) {
search(target, text, begin, targetCur + 1, textCur + 1, set);
}
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String targetStr = scanner.nextLine();
String textStr = scanner.nextLine();
char[] target = targetStr.toCharArray();
char[] text = textStr.toCharArray();
for (int i = 0; i < text.length; i++) {
search(target, text, i, 0, i, new HashSet<>());
}
if (!found) {
System.out.printf("%d %d\n", -1, 0);
}
}
} import sys class Solution: def match(i, j): # Terminator:当t每个元素都匹配到 if j == len(t): ans.add(i) # 千万不能忘记return return # 当前索引相等(小心越界) if i < len(s) and s[i] == t[j]: Solution.match(i + 1, j + 1) elif i < len(s) and t[j] == '*': # 1. 让*代表nothing Solution.match(i, j + 1) # 2. 让x代表s[i] Solution.match(i + 1, j + 1) # 2. 让*代表多个字符 Solution.match(i + 1, j) return if __name__ == "__main__": while True: # 读取第一行 t = sys.stdin.readline().strip() if t == '': break s = input() # 存储答案 ans = set() # 初始化没找到 if_find = False # 定字符的开始坐标i for i in range(len(s)): if s[i] == t[0]&nbs***bsp;t[0] == '*': Solution.match(i, 0) if len(ans): if_find = True for last_index in sorted(ans): if last_index > i: print(i, last_index - i) ans.clear() if not if_find: print(-1, 0)
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
char[] pat = sc.next().toCharArray();
char[] str = sc.next().toCharArray();
int count=0;
for (int i = 0; i < str.length; i++) {
for (int j = i; j < str.length; j++) {
// 匹配str[i..j]
if (match(pat, str, 0, i, j)) {
System.out.println( String.valueOf(i) + " " + String.valueOf(j - i + 1));
count++;
}
}
}
if(count==0){
System.out.println("-1 0");
}
}
public static boolean match(char[] pat, char[] str, int pIndex, int left, int right) {
if (pIndex == pat.length && left > right) {
//恰好匹配完
return true;
}
if (left > right && pIndex != pat.length && pat[pIndex] != '*') {
//pat过长
return false;
}
if (pIndex == pat.length && right >= left) {
// str过长
return false;
}
// pIndex!=length
else if (pat[pIndex] == '*') {
if (left > right) {
return match(pat, str, pIndex + 1, left, right);
} else {
return match(pat, str, pIndex, left + 1, right) || match(pat, str, pIndex + 1, left, right);
}
} else if (left <= right && pat[pIndex] == str[left]) {
return match(pat, str, pIndex + 1, left + 1, right);
} else if (left <= right && pat[pIndex] != str[left]) {
return false;
} else {
return false;
}
}
} 应该是暴力过,递归处理*那挺巧妙的import java.util.*;
public class Main{
private static ArrayList<Integer> list = new ArrayList<>();
private static char [] t;
private static char [] s;
public static void main(String[]args){
Scanner sc = new Scanner(System.in);
String str1 = sc.nextLine();
String str2 = sc.nextLine();
t = str1.toCharArray();
s = str2.toCharArray();
int flag = -1;
for(int i = 0; i< s.length; i++){
if(s[i] == t[0] || t[0] == '*'){
DFS(i,0);
if(!list.isEmpty())flag = 1;
for(Integer num:list){
//特殊情况:当t串的最后一个字符是*时
//例如t="*";s="shop"一种输出是(0,1)
//当i=0;j=0;时 运行到代码if(t[j]=='*')DFS(i,j+1)
//比较s的当前字符与t中*的下一个字符,由于*就是最后一个字符
//j值为t.length时,i的值为0,得到的输出结果为(0,0)
if(t[t.length-1]=='*'){
System.out.println(i+" "+(num-i+1));
}else{
System.out.println(i+" "+(num-i));
}
}
list.clear();
}
}
if(flag == -1){
System.out.println(flag+" "+0);
}
}
//i遍历字符串s,j遍历模式串t
private static void DFS(int i, int j){
if(j == t.length){
list.add(i);
return;
}
if(i == s.length)
return;
if(s[i] == t[j]){
DFS(i+1,j+1);
}else if(t[j] == '*'){
//*代表0个字符,比较s的当前字符与t中*的下一个字符
DFS(i,j+1);
//*代表多个字符,比较s的下一个字符与t中*
DFS(i+1,j);
//DFS(i+1,j+1);
}
return;
}
} #include <iostream>
#include <algorithm>
#include <set>
using namespace std;
string s, t;
set<int> q;
void dfs(int i, int j)
{
if(j == s.size()) q.insert(i);
if(i == t.size()) return;
if(t[i] == s[j]) dfs(i+1, j+1);
else if(s[j] == '*')
{
dfs(i, j+1);
dfs(i+1, j);
dfs(i+1, j+1);
}
}
int main()
{
cin >> s >> t;
bool flag = false;
for(int i = 0; i < t.size(); i++)
{
if(s[0] == '*' || s[0] == t[i])
dfs(i, 0);
if(q.size())
{
flag = true;
for(auto x : q)
if(x > i) cout << i << ' ' << x-i << endl;
}
q.clear();
}
if(!flag) cout << -1 << ' ' << 0 << endl;
return 0;
} def shipei(a,b):
j=-1
if a=='*':
return True
if '*' not in a:
if len(a)!=len(b):
return False
for i in range(len(a)):
j+=1
if a[i]=='*':
sp=False
s=a[i+1::]
for k in range(j,len(b)):
sp=sp&nbs***bsp;shipei(s,b[k::])
return sp
else:
if j<len(b):
if a[i]!=b[j]&nbs***bsp;j>len(b):
return False
else:
return False
return True
while True:
try:
str1=input()
str2=input()
n=0
ans=[]
sy=1
x=str1[0]
for i in range(len(str2)):
if x==str2[i]&nbs***bsp;x=='*':
for j in range(len(str2)):
if shipei(str1,str2[i:j+1]) and (j-i+1)>0:
sy=0
print(str(i)+' '+str(j-i+1))
if sy==1:
print('-1 0')
except:
break import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Main {
private static boolean match(String matchStr, String str, int matchIdx, int idx) {
if (matchIdx == matchStr.length() && idx == str.length()) {
return true;
}
//str匹配到最后一个字符了,matchIdx后面还有多个*的情况
if (idx == str.length() && matchIdx < matchStr.length() && matchStr.charAt(matchIdx) == '*') {
return match(matchStr, str, matchIdx + 1, idx);
}
if (matchIdx >= matchStr.length() || idx >= str.length()) {
return false;
}
//匹配中出现了不同的字符
if (matchStr.charAt(matchIdx) != '*' && matchStr.charAt(matchIdx) != str.charAt(idx)) {
return false;
}
boolean flag = false;
//匹配中对*处理,*能表示多个字符,所以idx + 1,直到到达str的最后一个字符
if (matchStr.charAt(matchIdx) == '*') {
flag = match(matchStr, str, matchIdx + 1, idx) || match(matchStr, str, matchIdx, idx + 1);
}
//匹配中两个字符串的字符相同的情况,用与或保证可以从false变回true
if (matchStr.charAt(matchIdx) == str.charAt(idx)) {
flag |= match(matchStr, str, matchIdx + 1, idx + 1);
}
return flag;
}
private static List<Integer[]> getMatchPosAndLen(String matchStr, String str) {
List<Integer[]> ans = new ArrayList<>();
//找到头尾都相等的情况
for (int i = 0; i < str.length(); ++i) {
//保证第一个字符相同
if (matchStr.charAt(0) != '*' && matchStr.charAt(0) != str.charAt(i)) {
continue;
}
for (int j = i; j < str.length(); ++j) {
//保证最后一个字符相同
if (matchStr.charAt(matchStr.length() - 1) != '*' && matchStr.charAt(matchStr.length() - 1) != str.charAt(j)) {
continue;
}
if (match(matchStr, str.substring(i, j + 1), 0, 0)) {
ans.add(new Integer[]{i, j - i + 1});
}
}
}
if (ans.size() == 0) {
ans.add(new Integer[]{-1, 0});
}
return ans;
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String matchStr = in.next();
String str = in.next();
List<Integer[]> list = getMatchPosAndLen(matchStr, str);
for (Integer[] arr : list) {
System.out.println(arr[0] + " " + arr[1]);
}
}
} # 将一楼的大佬的代码改写成了Python, all pass, 感谢
import sys
def DFS(i,j):
if j==len(t):
S.add(i)
return
if i==len(s):
return
if s[i]==t[j]:
DFS(i+1, j+1)
elif t[j]=='*':
DFS(i, j+1)
DFS(i+1, j)
DFS(i+1, j+1)
return
while True:
line = sys.stdin.readline().strip()
if line == '':
break
t = line
s = input()
S = set()
flag = False
for i in range(len(s)):
# i is the start idx of s
# S includes all the end index it that s[i:it] matches t
if s[i]==t[0] or t[0]=='*':
DFS(i, 0)
if len(S) != 0:
flag = True
for it in sorted(S):
if it>i:
print(i,it-i)
S.clear()
if not flag:
print(-1, 0)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
sc.useDelimiter("/n");
String a = sc.nextLine();
String b = sc.nextLine();
int bit = 0;
for(int i = 0; i<b.length();i++){
for(int j =i+1;j<b.length()+1;j++) {
String subS = b.substring(i,j);
if((subS != null) && (!subS.equals("")) &&(stringinit(subS,a))) {
bit =1;
System.out.println(i+" "+(j-i));
}
}
}
if(bit==0) {
System.out.println("-1 0");
}
}
public static boolean stringinit(String sub,String a){
String[] list = a.split("\\*");
int index = 0;
String tmp = sub;
if((sub.charAt(0)!=a.charAt(0)) && (a.charAt(0)!='*')){
return false;
}else if((sub.charAt(sub.length()-1)!=a.charAt(a.length()-1)) && (a.charAt(a.length()-1)!='*')){
return false;
}else {
for (int i = 0; i < list.length; i++) {
int tmpindex = tmp.indexOf(list[i]);
if(tmpindex == -1){
return false;
}else{
tmp = tmp.substring(tmpindex+list[i].length());
}
}
}
return true;
}
}