438. 找到字符串中所有字母异位词
给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引。
字符串只包含小写英文字母,并且字符串 s 和 p 的长度都不超过 20100。
说明:
字母异位词指字母相同,但排列不同的字符串。
不考虑答案输出的顺序。
示例 1:
输入:
s: “cbaebabacd” p: “abc”
输出:
[0, 6]
解释:
起始索引等于 0 的子串是 “cba”, 它是 “abc” 的字母异位词。
起始索引等于 6 的子串是 “bac”, 它是 “abc” 的字母异位词。
示例 2:
输入:
s: “abab” p: “ab”
输出:
[0, 1, 2]
解释:
起始索引等于 0 的子串是 “ab”, 它是 “ab” 的字母异位词。
起始索引等于 1 的子串是 “ba”, 它是 “ab” 的字母异位词。
起始索引等于 2 的子串是 “ab”, 它是 “ab” 的字母异位词。
int* findAnagrams(char * s, char * p, int* returnSize){
//有26个英文字母,设置大小为26
int arr_s[26] = {0};
int arr_p[26] = {0};
int count = 0;
int len1 = strlen(s);
int len2 = strlen(p);
int len = len1 - len2;
//返回数组的分配,及初始化
int *res = (int *)calloc(len1 + 1, sizeof(int));
*returnSize = 0;
if (len1 < 0 || len2 < 0) {return res;}
for (int i = 0; i < len2; i++) {
arr_p[p[i] - 'a']++;
} //将p中字母个数对应放在arr_p数组中
char *temp = s;
//增量j来控制滑动的长度,滑动到tmp+len时停止 len为两个字符串长度的差值
for (int j = 0; j <= len; j++) {
temp = s + j;
count = 0;
for (int i = 0; i < len2; i++) {
arr_s[temp[i] - 'a']++;
} //将s中字母个数对应放在arr_s数组中,滑动窗口大小为len2
for (int k = 0; k < 26; k++) {
if (arr_s[k] == arr_p[k]) {
count++;
} //比较两数组对应位置字母个数是否相同
arr_s[k] = 0; //清零arr_s数组
}
//当count==26 说明两个数组的内容完全相同
if (count == 26) {
res[(*returnSize)++] = j;
}
}
return res;
}
680. 验证回文字符串 Ⅱ
给定一个非空字符串 s,最多删除一个字符。判断是否能成为回文字符串。
示例 1:
输入: “aba”
输出: True
示例 2:
输入: “abca”
输出: True
解释: 你可以删除c字符。
注意:
字符串只包含从 a-z 的小写字母。字符串的最大长度是50000。
bool judge(char *s, int i, int j) {
while (i < j) {
if (s[i++] != s[j--]) {return false;}
}
return true;
} // 判断是否是回文串
bool validPalindrome(char * s){
for (int i = 0, j = strlen(s) - 1; i < j; i++, j--) {
if (s[i] != s[j]) {
return (judge(s, i+1, j) || judge(s, i, j-1));
} //两个字母不同时,左边减一或右边减一
}
return true;
}