问题:
思路:
用HashMap的方法 构想了好久,虽然解决了,但是性能不很好
我一开始的思路就是,因为只有窗口中的字母的个数与s1相同,才有希望,所以就从一开始就再s2中看s1.length()个字符,先用HashMap记录s1各个字母出现的个数,如果窗口中的情况与s1的相同,那就返回true。 然后一个个进出,进出中查看两边指针的字母,然后对HashMap进行更改。
但是HashMap 很显然更改其中字符很麻烦,并且,每个窗口,都要检查一次就很慢。
最后查看答案,发现有用长度为26的 int 数组来记录每个字母的出现个数的,这样感觉也很棒,等下次在尝试吧~
代码:
class Solution {
public boolean checkInclusion(String s1, String s2) {
//HashMap<> hs = new HashMap<>();
int left = 0;
int right = left+s1.length()-1;
if(right >= s2.length()){
return false;
}else{
HashMap<Character,Integer> hs = new HashMap<Character,Integer>();
for(int i = 0;i<s1.length();i++){
if(hs.containsKey(s1.charAt(i))){
int m = hs.get(s1.charAt(i))+1;
hs.remove(s1.charAt(i));
hs.put(s1.charAt(i),m);
}else{
hs.put(s1.charAt(i),1);
}
}
int flag = 0;
for(int i = 0;i<s1.length();i++){
if(hs.containsKey(s2.charAt(i))){
int k = hs.get(s2.charAt(i))-1;
hs.remove(s2.charAt(i));
hs.put(s2.charAt(i),k);
}
}
//int flag = 0;
for(int i = 0;i<s1.length();i++){
if(hs.get(s1.charAt(i))!=0){
flag = -1;
break;
}
}
if(flag == 0){
return true;
}else{
while(right<s2.length()-1){
right++;
if(hs.containsKey(s2.charAt(left))){
int k = hs.get(s2.charAt(left))+1;
hs.remove(s2.charAt(left));
hs.put(s2.charAt(left),k);
}
left++;
if(hs.containsKey(s2.charAt(right))){
int k = hs.get(s2.charAt(right))-1;
hs.remove(s2.charAt(right));
hs.put(s2.charAt(right),k);
}else{
continue;
}
flag = 0;
for(int i = 0;i<s1.length();i++){
if(hs.get(s1.charAt(i))!=0){
flag = -1;
break;
}
}
if(flag == 0){
return true;
}else{
continue;
}
}
return false;
}
}
}
}