题目描述:
给定m个不重复的字符 [a, b, c, d],以及一个长度为n的字符串tbcacbdata。
问:
能否在这个字符串中找到一个长度为m的连续子串,使得这个子串刚好由上面m个字符组成,顺序无所谓,返回任意满足条件的一个子串的起始位置,未找到返回-1。
示例:
字符:[a,b,c,d]
字符串:tbcacbdata
返回值:3
题目分析:
我们使用字符数组chars来存储给定的字符,使用定长为m的滑动窗口,在字符串上向右滑动,滑动次数为n-m次(长度为m的滑动窗口,在长度为n的字符串上向后移动n-m次便到达尾部),将每次滑动窗口内的字符串截取出来与chars进行比较,再判断chars中的字符是否都唯一的出现在该子串(窗口)中。
代码描述
class te01{
//方法声明为静态的只是放边在外面测试,无实意
public static int checkInclusion(char[] ch,String s){
int n=s.length();
int m = ch.length;
if(m>n) return -1;
//用来限制滑动窗口的移动次数
for(int i=0;i<n-m;i++){
if(checkEqual(ch,s.substring(i,i+m))){
return i;
}
}
return -1;
}
/*
检查给定的字符数组中的字符是否全都在“同等长度”的字符串中唯一出现
因为方法参数上的数组和字符串是等长的,所以我们只要检查字符数组ch中的字符在子串s中是否出现即可。
*/
public static boolean checkEqual(char[] ch,String s){
//逐一检查数组中的字符是否在字符串中出现过
for(int i=0;i<ch.length;i++){
//.indexOf(char ch)方法返回字符串中ch所在位置的索引,如果字符串中没有i则返回-1
if(s.indexOf(ch[i])==-1){
//当字符数组中任有一个字符未出现在该窗口(子串)中,立即返回false
return false;
}
}
return true;
}
}
代码测试:
public class DyWindows {
@Test
public void test01(){
String s = "tbcacbdata";
char[] chars = {'a','b','c','d'};
System.out.println(te01.checkInclusion(chars, s));
}
}
输出结果:
3