早上闲得无聊,写个判断回文的小程序,对于一个字符串,是否是回文,相信大家都知道。不过这个小demo可以清除混淆视听的字符,比如非字母,数字,清除空格然后再判断
废话少说上代码

1 #ifndef __PALINDROME_H 2 #define __PALINDROME_H 3 #include <string> 4 #include <sstream> 5 using std::string; 6 using std::stringstream; 7 // string trim的简单高效实现 8 string& LTrim(string& str) 9 { 10 if (str.find_first_not_of(" ")!=string::npos){ 11 str = str.substr(str.find_first_not_of(" ")); 12 } 13 return str; 14 } 15 16 string& RTrim(string& str) 17 { 18 if (str.find_first_not_of(" ")!=string::npos){ 19 str = str.substr(0,str.find_last_not_of(" ")+1); 20 } 21 return str; 22 } 23 24 string& trim(string& str) 25 { 26 return LTrim(RTrim(str)); 27 } 28 29 /************************************************************************/ 30 /* 去除中间的一些非字符,和空格 */ 31 /************************************************************************/ 32 string pre_process(string tmp) 33 { 34 string pre_tmp=trim(tmp); 35 stringstream ss; 36 char c_tmp; 37 for (int i=0,end=pre_tmp.length();i<end;i++) 38 { 39 c_tmp=pre_tmp.at(i); 40 if (c_tmp>='A' && c_tmp<='Z') 41 { 42 c_tmp+=32; 43 ss<<c_tmp; 44 } 45 else if ((c_tmp>='0' && c_tmp<='9') || (c_tmp>='a' && c_tmp<='z')) 46 ss<<c_tmp; 47 } 48 string pos_tmp; 49 ss>>pos_tmp; 50 return pos_tmp; 51 } 52 /* 53 判断是否是回文 "A man, a plan, a canal: Panama" is a palindrome. 54 要清楚中间的非字母元素.空字符也可以的 55 */ 56 bool is_palindrome(const string & str) 57 { 58 int len=str.length(); 59 if (len<=1) 60 return true; 61 char left,right; 62 string pstr=pre_process(str);//这里可能会对string进行删减,所以要重新赋值 63 len=pstr.length(); 64 for (int start=0,end=len-1;start<end;++start,--end) 65 { 66 left=pstr.at(start); 67 right=pstr.at(end); 68 if (left!=right) 69 return false; 70 } 71 return true; 72 } 73 74 75 #endif
至于怎么测相信就不用我来说了