字符串的排列
给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的排列。
换句话说,第一个字符串的排列之一是第二个字符串的子串。
示例1:
1 2 3
| 输入: s1 = "ab" s2 = "eidbaooo" 输出: True 解释: s2 包含 s1 的排列之一 ("ba").
|
示例2:
1 2
| 输入: s1= "ab" s2 = "eidboaoo" 输出: False
|
注意:
1.输入的字符串只包含小写字母
2.两个字符串的长度都在 [1, 10,000] 之间
第一次代码(超时)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| class Solution { public boolean checkInclusion(String s1, String s2) { if(s1==null||s2==null)return false; if(s1.length()==0||s2.length()==0)return false; char[] map=new char[s1.length()]; for(int i=0;i<map.length;i++) { map[i]=0; } //在这里声明变量应该会快一些 int num=-1; for(int i=0;i<s2.length();i++) { int begin=0; while(true) { num=s1.indexOf(s2.charAt(i),begin); if(num==-1) { int flag=1; for(int j=0;j<map.length;j++) { if(map[j]==0) { flag=0; } map[j]=0; } if(flag==1)return true; break; } if(map[num]==0) { map[num]=1; break; } else { //这里的意思是找到了,但是已经标记过了 begin=num; } } } return false; } }
|
第二次代码(参考)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| class Solution { public boolean checkInclusion(String s1, String s2) { if(s1==null||s2==null)return false; if(s1.length()==0||s2.length()==0)return false; char[] map=new char[26];
int len=s1.length(); for (int i=0;i<len;i++) { map[s1.charAt(i)-'a']++; } int i=0,j=0; for(;j<s2.length();) { map[s2.charAt(j)-'a']--; if(j-i+1==len) { int k=0; for(;k<26;k++) { if(map[k]!=0)break; } if(k==26)return true;
map[s2.charAt(i)-'a']++; i++; } j++; } return false; } }
|