这是一道简单题,却让我苦恼了很久,刚开始用的哈希表,但是一旦出现一个第一个字母相同就会返回true,所以行不通
我又想到哈希表配合指针最后也以失败告终
class Solution {
public:
bool isAnagram(string s, string t) {
vector<int>cnt(26);
if(s.size() != t.size())return false;
for(auto & c : s){
cnt[c - 'a']++;
if(cnt[c-'a']>1){
return true;
}
}
return false;
}
};
之后实在想不出来去看了官方解答,这是一个我可以看懂的解法
- 首先排除不能被i整除的循环,因为这种情况相当于一定会不一样,直接舍掉
- 所以i初始值为1,且为了再排除i加到n的情况,i*2<=n
- 在外设置bool原因在6.
- 把i的值赋给j这一点很妙,因为满足s[j]==s[j-i]才可以,若不满足进入下一个循环
还有一个原因就是这样j成了一个动态指针,是跟i一起变化的,但j-i还是等于0,索引不变
- 判断是否相同,有一个不同则将m改为false并且结束循环
- 最后的if很关键,若abcabc当时j只到b就会变成false,如果这个时候直接返回false就结束了,反之若此时为false先不返回继续第一个循环直到循环结束,此时返回false才是正确的。为真则证明是对的返回true没有问题
class Solution {
public:
bool repeatedSubstringPattern(string s) {
int n = s.size();
for(int i = 1;i* 2 <= n;++i){
if(n%i == 0){
bool m = true;
for(int j = i;j<n;++j){
if(s[j]!=s[j-i]){
m = false;
break;
}
}
if(m){
return true;
}
}
}
return false;
}
};
这个题的前置+和后置+没有区别,后置加设置更快,不清楚原因
class Solution {
public:
bool repeatedSubstringPattern(string s) {
int n = s.size();
for(int i = 1;i* 2 <= n;i++){
if(n%i == 0){
bool m = true;
for(int j = i;j<n;j++){
if(s[j]!=s[j-i]){
m = false;
break;
}
}
if(m){
return true;
}
}
}
return false;
}
};