は長さ n の文字列 str を返します。回文を形成できるように文字列内の各要素の位置を出力します。それ以外の場合は、「回文がありません」というメッセージを画面に出力します。
回文とは、逆方向または逆方向から読んだ文字の順序が順方向から読んだ文字の順序と同じである単語です。たとえば、「MADAM」、「レースカー」などです。
シーケンスまたは単語が回文であるかどうかを確認するには、通常、単語の逆を別の文字列に保存し、その 2 つを比較します。それらが同じであれば、指定された単語またはシーケンスは回文です。 。しかし、この問題では、回文内の単語またはシーケンスを形成するために順列を出力する必要があります。
同様に、文字列 str = "tinni" があり、それは intni または nitin である可能性があるため、1 から始まるインデックスとして返す必要があり、結果の順序は 2 3 1 4 5 または 3 2 のいずれかになります。 1 5 4 2 つのうちの 1 つ。
上記の問題には、以下の例のような解決策が必要です -
Input: string str = “baa” Output: 2 1 3 Input: string str = “tinni” Output: 2 3 1 4 5
void printPalindromePos(string &str) START STEP 1: DECLARE vector<int> pos[MAX] STEP 2: DECLARE AND ASSIGN n WITH LENGTH OF str STEP 3: LOOP FOR i = 0 AND i < n AND i++ pos[str[i]].push_back(i+1) END LOOP STEP 4: SET oddCount = 0 STEP 5: DECLARE oddChar STEP 6: LOOP FOR i=0 AND i<MAX AND i++ IF pos[i].size() % 2 != 0 THEN, INCREMENT oddCount BY 1 SET oddChar AS i END IF END FOR STEP 7: IF oddCount > 1 THEN, PRINT "NO PALINDROME" STEP 8: LOOP FOR i=0 AND i<MAX AND i++ DECRLARE mid = pos[i].size()/2 LOOP FOR j=0 AND j<mid AND j++ PRINT pos[i][j] END LOOP END LOOP STEP 9: IF oddCount > 0 THEN, DECLARE AND SET last = pos[oddChar].size() - 1 PRINT pos[oddChar][last] SET pos[oddChar].pop_back(); END IF STEP 10: LOOP FOR i=MAX-1 AND i>=0 AND i-- DECLARE AND SET count = pos[i].size() LOOP FOR j=count/2 AND j<count AND j++ PRINT pos[i][j] STOP
#include <bits/stdc++.h> using namespace std; // Giving the maximum characters const int MAX = 256; void printPalindromePos(string &str){ //Inserting all positions of characters in the given string. vector<int> pos[MAX]; int n = str.length(); for (int i = 0; i < n; i++) pos[str[i]].push_back(i+1); /* find the number of odd elements.Takes O(n) */ int oddCount = 0; char oddChar; for (int i=0; i<MAX; i++) { if (pos[i].size() % 2 != 0) { oddCount++; oddChar = i; } } /* Palindrome can't contain more than 1 odd characters */ if (oddCount > 1) cout << "NO PALINDROME"; /* Print positions in first half of palindrome */ for (int i=0; i<MAX; i++){ int mid = pos[i].size()/2; for (int j=0; j<mid; j++) cout << pos[i][j] << " "; } // Consider one instance odd character if (oddCount > 0){ int last = pos[oddChar].size() - 1; cout << pos[oddChar][last] << " "; pos[oddChar].pop_back(); } /* Print positions in second half of palindrome */ for (int i=MAX-1; i>=0; i--){ int count = pos[i].size(); for (int j=count/2; j<count; j++) cout << pos[i][j] << " "; } } int main(){ string s = "tinni"; printPalindromePos(s); return 0; }
上記のプログラムを実行すると、次の出力が生成されます-
2 3 1 4 5
以上が配置された文字位置を回文になるように出力するCプログラムの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。