【问题标题】:Longest Palindromic Sub String最长回文子串
【发布时间】:2015-11-12 20:28:08
【问题描述】:

我正在尝试通过 leet 代码解决问题。我为此写了一个方法。这在本地 Eclipse 中完美运行,但是当我在 leetcode 提交此解决方案时,它说超出了时间限制。

有人可以向我建议我可以在下面的代码中进行更改以使其更快地工作吗?我也可以在这篇文章中输入字符串。

代码:

public String longestPalindrome(String s) {
   if(s.equals("")) return "";
   if(s.length()==1) return s;
   if(s.length()==2) {
       if(s.charAt(0) == s.charAt(1))
           return s;      
   }

   char[] ch = s.toCharArray();
   Set<Integer> set = new HashSet<Integer>();
   int maxP=0;String maxPalin="";

   for(int i =2;i < s.length();i++){
       if((ch[i-1]==ch[i] || ch[i-2] == ch[i]) && !set.contains(i) ){
           int loop;
           if(ch[i-1]==ch[i]){
               loop=i-1;
           }
           else{
               loop=i-2;
           }

           for(int k =i,l=loop; l>=0 && k<s.length();k++,l--){
               if(ch[k]!= ch[l]){
                   if(maxP < s.substring(l+1, k).length())
                   maxPalin=s.substring(l+1, k);
                   maxP=s.substring(l+1, k).length();
                   set.add(i);
                   i=2;
                   break;
               }
               if(l==0){
                   if(maxP < s.substring(0, k+1).length())
                       maxPalin=s.substring(0, k+1);
                       maxP=s.substring(0, k+1).length();
                       set.add(i);
                       i=2;
                       break;
               }
               if(k== s.length()-1){
                   if(maxP < s.substring(l, s.length()).length())
                   maxPalin=s.substring(l, s.length());
                   maxP=s.substring(l, s.length()).length();
                   set.add(i);
                   i=2;
                   break;
               }
           }
       }
   }

   return maxPalin;
}

输入:

ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg P>

【问题讨论】:

  • 花点时间阅读帮助中心的editing help。 Stack Overflow 上的格式设置与其他站点不同。您的帖子看起来越好,用户就越容易为您提供帮助。
  • @gunr2171 如果我错过了保持帖子格式,我很抱歉。这是我在 stackoverflow 上的第一篇文章。我只是在寻找一种方法,让我可以更快,不到 1 毫秒。谢谢。
  • 不用担心不知道格式。有很多人会密切关注新帖子以帮助解决格式问题。

标签: java substring palindrome


【解决方案1】:

遍历字符,对于所有位置检查下一个字符是否与当前字符相同(例如'f','f')或之后的字符和之前的字符是否相同(例如'f',' g','f')。 如果是这种情况,请向后和向前循环并比较字符,直到找到两个不匹配的字符。 将字符串的长度与迄今为止找到的最长的字符串进行比较,如果更长,请保存。 转到下一个字符。 如果你找到一个长度/2大于剩余字符数的回文,你也可以退出循环。

【讨论】:

  • 感谢乔纳斯!是的,我同意你退出循环逻辑。
  • 我正在实现您迭代的相同逻辑。但是每次找到回文时,我们都必须回到第一个字符。我在 Hashset 中保留断点,这样我们就不会搜索相同的子字符串。
  • 例如 - "abbadabba" 在这种情况下,我们总共有 3 个回文子串 1. abba 2.badab 3. abbadabba 。因此,当我们获取回文时,我们必须返回重新开始循环。
猜你喜欢
  • 2021-05-15
  • 1970-01-01
  • 2015-07-09
  • 1970-01-01
  • 1970-01-01
  • 2023-01-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多