例如串 abc,它的子序列就有 {空串, a, b, c, ab, ac, bc, abc} 8 种,现要输入两行序列,判断第二行序列是不是第一行的子序列:
import java.util.*;
public class Main {
static ArrayList<String> list=new ArrayList<>();
public static void test1(char[] ch,StringBuffer sb,int start){//全排列str1,把所有排序可能放在list中
for (int i = start; i < ch.length; i++) {
sb.append(ch[i]);
list.add(sb.toString());
if (sb.length()<ch.length) {
test(ch, sb, i+1);
}
sb.setLength(sb.length()-1);//设置长度减一的原因,就是去前面几个字符例如输入utk,当遍历到k,不能继续遍历了,不得不通过截取长度的方式,删除末尾元素,从而得到uk的目的
}
}
public static boolean text(String str1,String str2){//在list中寻找是否有str2
char[] ch=str1.toCharArray();
StringBuffer sb=new StringBuffer();
test(ch, sb, 0);
if (list.contains(str2)) {
return true;
}
return false;
}
private static void test(char[] ch, StringBuffer sb, int start) {
for(int i=start;i<ch.length;i++){
sb.append(ch[i]);
list.add(sb.toString());
if(sb.length()<ch.length){
test(ch, sb, i+1);
}
sb.setLength(sb.length()-1);
}
}
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
while(scanner.hasNext()){
String str1=scanner.next();
String str2=scanner.next();
if(text(str1,str2)){
System.out.println("Yes");
}
else{
System.out.println("No");
}
}
}
}