ML-czy的小组任务3

本文介绍了四个关于回文串和子串的编程问题,包括验证回文串、查找子串最大出现次数、判断回文字串及找出最长回文串。通过示例代码展示了如何在Python和C++中解决这些问题,涉及字符串处理、双指针、字典哈希计数等技术。
摘要由CSDN通过智能技术生成

1.验证回文串:
链接: 题目链接
在这里插入图片描述
这道回文串的题见得也不少了,就是正序和倒序都一模一样的东西,在力扣中咱们不需要输入,只需要进行判断,这里char *s其实就已经是力扣给咱们的现成字符串,咱们只需要进行判断,长度就是strlen(s),指针和数组其实是大同小异的,或者直接while(s[i]),因为字符串最后一位是’\0’,这为while提供了终止条件,也就不需要知道长度了,代码如下:

bool isPalindrome(char * s){
    int i = 0,j = 0;
    while(s[i]){//首先对字符串进行一个更新,排除大小写因素与非字母与数字因素,用ascii编码
        if(s[i] >= 48 && s[i] <= 57)//当为字符数字时
            s[j++] = s[i];
        else if(s[i] >= 65 && s[i] <= 90){//当为大写字母时
            s[i] += 32;//转小写
            s[j++]= s[i];
        }
        else if(s[i] >= 97 && s[i] <= 122)//当为小写字母时
            s[j++] = s[i];
        i++;
    }
    int left = 0,right = j - 1;//利用快排思想,分别从左和右进行判断
    while(left < right){
        if(s[left] != s[right])
            return false;
        left++;
        right--;
    }
    return true;
}

2.子串的最大出现次数:
链接: 题目链接
在这里插入图片描述
这道题用python好写,思路清晰,也有对应的函数,代码如下:

class Solution:
    def maxFreq(self, s: str, maxLetters: int, minSize: int, maxSize: int) -> int:
        n = len(s)
        occ = collections.defaultdict(int) #构建字典并返回int型数据
        ans = 0
        for i in range(n):
            exist = set() #创建一个集合,目的是利用集合性质去重
            cur = ""
            for j in range(i, min(n, i + maxSize)):
                exist.add(s[j])
                if len(exist) > maxLetters:#当集合长度大于规定数量则终止
                    break
                cur += s[j]#存储最大子串
                if j - i + 1 >= minSize:
                    occ[cur] += 1 #满足条件次数加1
                    ans = max(ans, occ[cur]) #选出最大子串
        return ans


3.回文字串:
链接: 题目链接
在这里插入图片描述

这道题在于对子串回文的判断,当子串长度为一时,就是回文子串,当为二时,相等为回文子串,当长度大于三时,不断迭代去掉首尾后子串满足前两个条件时为回文子串,代码如下:

class Solution:
    def countSubstrings(self, s: str) -> int:
        # dp[i][j]代表子串[i, j] 
        n = len(s)
        dp = [[False] * n for _ in range(n)] #生成二维矩阵
        count = 0
        # 枚举所有可能 因为代表子串 所以 i <= j
        for j in range(n):
            for i in range(0, j + 1):
                # 子串长度
                length = j - i + 1 #举个例子dp[2][3],长度为2,3-2+1=2,所以是j-i+1
                # 只有一个字符 直接就是一个回文串
                if length == 1:
                    dp[i][j] = True #定为True,作为长度大于3的子串判断标准
                    count += 1
                # 两个字符 只有相等才是回文串
                if length == 2 and s[i] == s[j]: #同上
                    dp[i][j] = True
                    count += 1
                # 超过两个字符 首位相同 且除去首尾的子串是回文串 才是回文串
                if length > 2 and s[i] == s[j] and dp[i+1][j-1] is True:
                    dp[i][j] = True
                    count += 1
        return count

4.最长回文串:
链接: 题目链接
在这里插入图片描述
上题想法需要直接一点,要知道回文串,就要先知道它们每个字符出现的次数,奇数考虑对称轴,偶数放中间,这道题是计算最大回文串的长度,那其实就很暴力了,可能一些小伙伴以为这题需要分情况,但其实只需举例子就可以得出答案的推导公式!!!
具体解释如下:

int longestPalindrome(char * s){
    int c[128] = {0};//ascii码字符最大数
    int len = strlen(s);
    int ret = 0;

    //构造以字母为下标的哈希计数表,统计字符串中每个字母出现的次数 
    for(int i=0; i<len; ++i)
    {
        c[s[i]]++; 
    }

    for(int i=0; i<128; i++)
    {
        ret += c[i] - c[i] % 2;   //需要去找规律,奇数情况下减一,偶数情况下直接加,可以找(abc,abcba,bbcc)的规律,你会发现满足这个数学公式. 
    }

    //如果不是相等长度,例如abca,a出现了两次,放在对称轴两侧,那么中间随便放一个就满足回文串了;如果都只出现了一次那上式ret为零,随便一个就是回文串,则长度加一. 
    if(ret < len)
        ret += 1;
    
    return ret; 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值