字典解法
有几个值得注意的点:
1.for循环遍历要使用的条件是 i 不大于字符串的长度,也就是i < s.length()
( 求数组长度使用的是 s.length() 方法所以要加() 而数组length是属性 所以不用加() )
2.s.charAt (int index) 方法 指的是获取该字符串index索引下的字符.
3.因为我们只是要 "比较" ,所以我们只需要相对的字符代表的ANCII值就足够了,这也是为什么
我们只定义了一个大小为26的int类型的数组,
s.charAt(i) - 'a'的意思就是 目标字符的ANSI值 减去了 'a'这个字符的ANCII值
class Solution {
public boolean isAnagram(String s, String t) {
int[] record = new int[26];
for(int i = 0;i<s.length();i++){
record[s.charAt(i)-'a']++;
}
for(int i = 0;i<t.length();i++){
record[t.charAt(i)-'a']--;
}
for(int count: record){
if(count != 0){
return false;
}
}
return true;
}
}
注意点1: ArrayList <Integer> arr = new ArrayList <Integer>(); 这个定义数组要会写
注意点2: ++ 与 -- 注意区分
注意点3: 注意字符串s 比 字符串p 个数少的情况 可以直接return 一个空数组
暴力破解法:
class Solution {
public List<Integer> findAnagrams(String s, String p) {
ArrayList<Integer> arr = new ArrayList <Integer> ();
if(s.length()<p.length()){
return arr;
}
int index1 = 0;
int index2 = p.length();
while(index2!=s.length()+1){
int[] record = new int [26];
for(int i = 0;i<p.length();i++){
record[p.charAt(i)-'a']++;
}
for(int i = index1;i<index2;i++){
record[s.charAt(i)-'a']--;
}
int index3 = 0;
for(int count:record){
if(count!=0){
break;
}
index3++;
}
if(index3 == 26){
arr.add(index1);
}
index1++;
index2++;
}
return arr;
}
}