1、415有效回文串题目链接
给定一个字符串,判断其是否为一个回文串。只包含字母和数字,忽略大小写。
注意事项
你是否考虑过,字符串有可能是空字符串?这是面试过程中,面试官常常会问的问题。
在这个题目中,我们将空字符串判定为有效回文。
样例
"A man, a plan, a canal: Panama"
是一个回文。
"race a car"
不是一个回文。
挑战
O(n) 时间复杂度,且不占用额外空间。
<span style="font-family:Courier New;font-size:18px;">class Solution {
public:
/**
* @param s A string
* @return Whether the string is a valid palindrome
*/
bool isPalindrome(string& s) {
// Write your code here
string copys;
for(int i=0;i!=s.size();++i){
if(isalnum(s[i])){
copys.push_back(tolower(s[i]));
}
}
string copy2=copys;
reverse(copys.begin(),copys.end());
return copy2==copys;
}
};</span>
2、分割回文串点击打开链接
分割回文串
给定一个字符串s,将s分割成一些子串,使每个子串都是回文串。
返回s所有可能的回文串分割方案。
样例
给出 s = "aab"
,返回
[
["aa", "b"],
["a", "a", "b"]
]
<span style="font-family:Courier New;font-size:18px;">class Solution {
public:
/**
* @param s: A string
* @return: A list of lists of string
*/
vector<vector<string>> partition(string s) {
// write your code here
vector<string> path;
vector<vector<string>> ret;
int n=s.size();
solve(s,path,ret,n,0);
return ret;
}
bool isPalindrome(string &s){
int start=0;
int end=s.size()-1;
while(s[start]==s[end]){
++start;--end;
if(start>=end)
return true;
}
return false;
}
void solve(string s,vector<string> &path,vector<vector<string>> &ret,int length,int pos){
if(pos==length){
ret.push_back(path);
}
for(int i=pos;i<length;++i){
string prefix=s.substr(pos,i-pos+1);
if(!isPalindrome(prefix))continue;
path.push_back(prefix);
solve(s,path,ret,length,i+1);
path.pop_back();
}
}
};</span>
3、题目链接
分割回文串 II
<span style="font-family:Courier New;">class Solution {
public:
/**
* @param s a string
* @return an integer
*/
int minCut(string s) {
// write your code here
if(s.size()<2)return 0;
int n=s.size();
vector<vector<bool>> p(n,vector<bool>(n,false));
vector<int> dp(n+1,0);
for(int i=0;i<=n;++i){
dp[i]=n-i-1;
}
for(int i=n-1;i>=0;--i){
for(int j=i;j<n;++j){
if(s[i]==s[j]&&(j-i<=1||p[i+1][j-1])){
p[i][j]=true;
dp[i]=min(dp[i],dp[j+1]+1);
}
}
}
return dp[0];
}
};
</span>