判断回文字符串
一种是暴力检索
另外一种则是中心扩散法
暴力搜索法:
从字符串的开始和末尾处标定一个点后,依次向后向前检索,并判断前后检索的字符串是否相同
bool isPalindrome(string s)
{
if (s.size() == 0) return true;
int start = 0, end = s.size() - 1;
while (start <= end)
{
if (s[start] != s[end])
return false;
start++;
end--;
}
return true;
}
中心扩散法:
利用双指针去线性扫描一遍 [i, j] 判断是否回文。我们先预处理除所有的 rec[i][j],rec[i][j] 代表 字符串s的[i, j] 这一段是否为回文串。是则为true,不是则为false,
注意:一开始我们初始化rec需要全部设置为false。
思路:以下图为例,
1.单个字符串一定是回文串,那么接着判断相邻的两个字符串,很简单只要相邻两个字符相同,
则一定是回文串。
2.接着判断三个即三个以上的字符串,以cbc为例,两个c指针分别为i,j,
此时需要有前提就是这两个位置的字符首先得相同即s[i] == s[j],
其次判断rec[i][j]是不是回文串只需要看[i + 1][j - 1]之间的字符串,即指针分别往中间移一位,此时若[i+1][j-1]之间是回文串,
则[i][j] 之间就一定是回文串,cbc,c==c,若两个c之间是回文串,则cbc是回文串
同样道理字符串cccc,c=s[i] == s[j]=c,指针往中间移[i + 1][j - 1]之间的cc是回文串,所以[i]和[j]之间的cccc是回文串
void GetRec(vector<vector<bool>>& rec, string& s) {
for (int j = 0; j < s.size(); j++) {
rec[j][j] = true;//单个字符串一定是回文串
if (j != 0)
rec[j - 1][j] = s[j - 1] == s[j];
for (int i = 0; i < j - 1; i++) {
if (s[i] == s[j])
rec[i][j] = rec[i + 1][j - 1];//中心扩散法判断回文字符串
else
rec[i][j] = false;
}
}
}
注:若被判断的数x为整型数据,那么还有一种更简单的方法判断,只需要让x与他的反数reversed(x)相等即可
代码如下:
class A {
public: bool huiwenchuan(int x) {
int temp = 0;
long reversed = 0;
while (x != 0) {
temp = x % 10;
reversed = reversed * 10 + temp;
x = x/10;
}
if (reversed >= INT_MAX || reversed <= INT_MIN) {
reversed = 0;
}
if(reversed==x){
return true;
}
else{
return false;
}
};