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;
}