[1日に1つの質問] 18:回文を確認する

タイトルの説明

文字列が与えられた場合、それが回文文字列であることを確認します。アルファベットと数字のみを考慮して、文字の大文字と小文字は無視できます。

説明:この質問では、空のストリングを有効な回文ストリングとして定義します。

例1:

入力:「男、計画、運河:パナマ」
出力:true

例2:

入力:「レースカー」
出力:false

アイデア:

  1. 文字列の最初と最後から同時に文字列をトラバースする

  2. 最初に、文字列のこの位置にある文字が英数字かどうかを判別します(関数を記述します)。

  3. そうである場合は、下付き文字を保存してループからジャンプします(このプロセスでは、大文字と小文字が均一に配置されます)。そうでない場合は、この文字をスキップして次の文字を検出します

  4. 前後の添え字に対応する文字を比較して、文字列が回文かどうかを判別します

コードは次のとおりです。

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;
}

コード生成図
ここに画像の説明を挿入


別の意見がある場合は、メッセージを残して話し合ってください〜

元の記事を152件公開 賞賛されている45件 10,000回以上の閲覧

おすすめ

転載: blog.csdn.net/AngelDg/article/details/105047183