1. 程式人生 > >嘔心瀝血演算法題——最大子串

嘔心瀝血演算法題——最大子串

// 串“abcba”以字母“c”為中心左右對稱;串“abba”是另一種模式的左右對稱。
// 這兩種情況我們都稱這個串是映象串。特別地,只含有1個字母的串,可以看成是第一種模式的映象串。
// 一個串可以含有許多映象子串。我們的目標是求一個串的最大映象子串(最長的映象子串),
// 如果有多個最大映象子串,對稱中心靠左的優先選中。例如:“abcdeefghhgfeiieje444k444lmn”的最大映象子串是:“efghhgfe”


function f(s) {
   // 所求的最大對稱子串
   let max_s = "";
   for (let i = 0; i < s.length; i++) {
      // 第一種對稱模式
      let step = 1;
      try {
         for (; ;) {
            if (s.charAt(i - step) != s.charAt(i + step))
               break;
            step++;
         }
      } catch (e) {
      }
      let s1 = s.substring(i - step + 1, i + step);
      // 第二種對稱模式
      step = 0;
      try {
         for (; ;) {
            if (s.charAt(i - step) != s.charAt(i + step + 1))
               break;
            step++;
         }
      } catch (e) {
      }
      let s2 = s.substring(i - step + 1, i + step + 1);
      if (s1.length > max_s.length)
         max_s = s1;
      if (s2.length > max_s.length)
         max_s = s2;
   }
   console.log(max_s);
}

f('abcdeefghhgfeiieje444k444lmn');