题意为,给一个长字符串t,和几个短字符串s[],求可完全覆盖t的使用的s的最少个数。可以重叠。
解决:
1,从t的下标0开始,找到一个可以匹配的最长的短字符串s1
2,在t的下标[1,1+len(s1)]范围内,找到一个可以匹配的最长的短字符串s2,记录此时t的被覆盖部分的最右下标为MAX。记录s2在字符串t的匹配起始位置下标为position
3,在t的下标[position+1,MAX+1]范围内,找最长的匹配…以此类推。
public static void main(String args[]){
solve();
}
static void find(int a,int b,String t,String[] s,int[][] match){
//System.out.println(a+" "+b);
int MAX=0,position=0,id=-1;
for(int i=a;i<=b;i++){
for(int j=0;j<s.length;j++){
if(i+s[j].length()>t.length()||i+s[j].length()<=b)continue;
if(s[j].equals(t.substring(i,i+s[j].length()))){
if(MAX<i+s[j].length()){
MAX=i+s[j].length();
position=i;
id=j;
}
}
}
}
if(id==-1){
ok=false;
return;
}else{
match[ans][0]=id;
match[ans][1]=position;
ans++;
if(MAX==t.length())return;
find(position+1,MAX,t,s,match);
}
}
private static void solve() {
int q=sc.nextInt();
while(q-->0){
ans=0;
ok=true;
String t=sc.nextLine();
int n=sc.nextInt();
String s[]=new String[n];
int match[][]=new int[t.length()][2];
for(int i=0;i<n;i++){
s[i]=sc.nextLine();
}
find(0,0,t,s,match);
if(!ok){
System.out.println("-1");
}else{
System.out.println(ans);
for(int i=0;i<ans;i++){
System.out.println((match[i][0]+1)+" "+(match[i][1]+1));
}
}
}
}
}