[プログラマー/CPP/JS]最長のファリン症候群


[程序]最长的法林德龙


1.質問


前後を逆さまにしても、同じ文字列を「回文」と呼ぶ.
文字列sが与えられた場合、解関数を完了し、sの部分文字列(Substring)の中で最も長いパリンドロン長を返します.
たとえば、文字列sがabcdcbaの場合、7を返し、abacdeの場合、3を返します.

2.制限

  • 文字列sの長さ:2500以下の自然数
  • 文字列sは、アルファベット小文字のみからなる
  • 3.解答

  • は直接繰り返しドアの前で彼を救った.
  • 時間を超えると思いますが、ありません.
  • 4.最初のコードと異なる点

  • 例の問題では、特定の文字基準の前後が同じ(総文字数が奇数)文字しかないため、奇数のみを検索してエラーが発生します.
  • 標準が数字ではなく、数字の間の総文字数が偶数である場合も、見つけなければなりません.
  • どうすればいいか考えているうちに、forの複文を書いた.통과했다.

    5.コード

    #include <iostream>
    #include <string>
    #include <algorithm>
    
    using namespace std;
    int solution(string s){
        int answer=1;
        int len = s.size();
        
        for(int i=1; i<len-1; i++){
            int count=0;
            int maxLen = min(i, len-i+1);
            
            for(int j=1; j<=maxLen; j++){
                if(s[i-j] != s[i+j]) break;
                count++;
            }
            
            answer = max(answer, count*2+1);
        }
        
        for(int i=0; i<len-1; i++){
            int count=0;
            int maxLen = min(i, len-i-2);
            
            for(int j=0; j<=maxLen; j++){
                if(s[i-j] != s[i+j+1]) break;
                count++;
            }
            
            answer = max(answer, count*2);
        }
    
        return answer;
    }

    6.コード(JS)

    function solution(s) {
      const isPalindrome = word => {
        let left = 0;
        let right = word.length - 1;
    
        while (left < right) {
          if (word[left++] !== word[right--]) return false;
        }
        return true;
      };
    
      const len = s.length;
      for (let i = len; i > 1; i--) {
        for (let j = 0; j <= len - i; j++) {
          if (isPalindrome(s.slice(j, j + i))) return i;
        }
      }
    
      return 1;
    }