タイトルの説明
文字列が与えられた場合、それが回文文字列であることを確認します。アルファベットと数字のみを考慮して、文字の大文字と小文字は無視できます。
説明:この質問では、空のストリングを有効な回文ストリングとして定義します。
例1:
入力:「男、計画、運河:パナマ」
出力:true
例2:
入力:「レースカー」
出力:false
アイデア:
-
文字列の最初と最後から同時に文字列をトラバースする
-
最初に、文字列のこの位置にある文字が英数字かどうかを判別します(関数を記述します)。
-
そうである場合は、下付き文字を保存してループからジャンプします(このプロセスでは、大文字と小文字が均一に配置されます)。そうでない場合は、この文字をスキップして次の文字を検出します
-
前後の添え字に対応する文字を比較して、文字列が回文かどうかを判別します
コードは次のとおりです。
bool IsNumber(char c){
return (c >= '0' && c <= '9') || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z');
}
class Solution {
public:
bool isPalindrome(string s) {
if(s.empty())
return true;
int start = 0;
int end = s.size() - 1;
while(start < end){
while(start != end){
if(IsNumber(s[start])){
if((s[start] >= 'A' && s[start] <= 'Z')){
s[start] += 32;
}
break;
}
++start;
}
while(start != end){
if(IsNumber(s[end])){
if((s[end] >= 'A' && s[end] <= 'Z')){
s[end] += 32;
}
break;
}
--end;
}
if(s[start] == s[end]){
++start;
--end;
}
else{
return false;
}
}
return true;
}
};
//验证代码
int main() {
Solution S;
string str;
getline(cin, str);
if(S.isPalindrome(str))
cout << "true" << endl;
else
cout << "false" << endl;
return 0;
}
コード生成図
別の意見がある場合は、メッセージを残して話し合ってください〜