leetcode125.验证回文串
题目描述
如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串。
字母和数字都属于字母数字字符。
给你一个字符串 s,如果它是 回文串 ,返回 true ;否则,返回 false 。
示例 1:
输入: s = “A man, a plan, a canal: Panama”
输出:true
解释:“amanaplanacanalpanama” 是回文串。
示例 2:
输入:s = “race a car”
输出:false
解释:“raceacar” 不是回文串。
示例 3:
输入:s = " "
输出:true
解释:在移除非字母数字字符之后,s 是一个空字符串 “” 。
由于空字符串正着反着读都一样,所以是回文串。
提示:
1 <= s.length <= 2 * 105
s 仅由可打印的 ASCII 字符组成
bool isPalindrome(char* s) {
for(int left=0,right=strlen(s)-1;left<right;left++,right--){
while(left<right&&!isalpha(s[left])&&!isdigit(s[left]))
left++;
while(left<right&&!isalpha(s[right])&&!isdigit(s[right]))
right--;
if(tolower(s[left])!=tolower(s[right]))
return false;
}
return true;
}
leetcode.5最长回文串
题目描述
给你一个字符串 s,找到 s 中最长的 回文子串。
示例 1:
输入:s = “babad”
输出:“bab”
解释:“aba” 同样是符合题意的答案。
示例 2:
输入:s = “cbbd”
输出:“bb”
提示:
1 <= s.length <= 1000
s 仅由数字和英文字母组成
解题思路
方法一:暴力法
/*int isPalindor(char* s,int left,int right){
int l=left;int r=right;
while(l>=0&&r<strlen(s)&&s[l]==s[r]){
l--;
r++;
}
return r-l-1;
}
char* longestPalindrome(char* s) {
int n=strlen(s);
if(n<1) return "";
int start=0;
int end=0;
int maxlen=0;
for(int i=0;i<n;i++){
int len1=isPalindor(s,i,i);
int len2=isPalindor(s,i,i+1);
maxlen=fmax(len1,len2);
if(maxlen>end-start){
start=i-(maxlen-1)/2;
end=i+maxlen/2;
}
}
char *res=malloc((end-start+2)*sizeof(char));
strncpy(res,s+start,end-start+1);
res[end-start+1]='\0';
return res;
}*/
int isPalindor(char* s,int left,int right){
while(left<right){
if(s[left]!=s[right]){
return 0;
}
left++;
right--;
}
return 1;
}
char* longestPalindrome(char* s) {
int n=strlen(s);
if(n==1) return s;
int start=0;
int maxlen=0;
for(int i=0;i<n;i++){
for(int j=0;i-j>=0&&i+j<=n;j++){
if(isPalindor(s,i-j,i+j)){
if(2*j+1>maxlen){
maxlen=2*j+1;
start=i-j;
}
}
}
}
for(int i=0;i<n;i++){
for(int j=0;i-j>=0&&i+1+j<=n;j++){
if(isPalindor(s,i-j,i+1+j)){
if(2*j+2>maxlen){
maxlen=2*j+2;
start=i-j;
}
}
}
}
char *res=malloc((maxlen+1)*sizeof(char));
strncpy(res,s+start,maxlen);
res[maxlen]='\0';
return res;
}
方法二:中心扩展法
int isPalindor(char* s,int left,int right){
int l=left;int r=right;
while(l>=0&&r<strlen(s)&&s[l]==s[r]){
l--;
r++;
}
return r-l-1;
}
char* longestPalindrome(char* s) {
int n=strlen(s);
if(n<1) return "";
int start=0;
int end=0;
int maxlen=0;
for(int i=0;i<n;i++){
int len1=isPalindor(s,i,i);
int len2=isPalindor(s,i,i+1);
maxlen=fmax(len1,len2);
if(maxlen>end-start){
start=i-(maxlen-1)/2;
end=i+maxlen/2;
}
}
char *res=malloc((end-start+2)*sizeof(char));
strncpy(res,s+start,end-start+1);
res[end-start+1]='\0';
return res;
}