LeetCode练习题438、680

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值