判断回文字符串
一种是暴力检索
另外一种则是中心扩散法
暴力搜索法:
从字符串的开始和末尾处标定一个点后,依次向后向前检索,并判断前后检索的字符串是否相同
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;
}
中心扩散法:
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)相等即可