最长的回文子序列

时间:2018-04-11 13:10:33

标签: python algorithm computer-science

我尝试使用递归来解决它。这是我的代码。它失败了#AB; ABDA" (返回3而不是1)。我的理由很明显,但我不确定如何解决这个问题。

LocusService locusService = new LocusService(this);
locusService.startRealtimeGPSListening(1000);   //Set intervel

locusService.setRealTimeLocationListener(new LocusService.RealtimeListenerService() {
        @Override
        public void OnRealLocationChanged(Location location) {
                if(location!=null){
                  //Do your Stuff here
                  finish();
                }
        }
    });

1 个答案:

答案 0 :(得分:0)

这个问题遗漏了一些信息,无法确切地知道您在寻找什么。我将在下面假设您想​​要找到也是后缀的最长前缀(以相反的顺序)。

递归地,想法是比较第一个和最后一个字符。如果它们不相等,则它不能成为一个回文(在这种情况下,返回0)。如果它们相等,那个“回文部分”的长度是1 +剩余单词的“回文部分”的长度(即没有第一个和最后一个字符的单词):

def lps(word):
  if len(word) > 0 and word[0] == word[-1]:
    return 1 + lps(word[1:-1])
  else:
    return 0

print(lps('abc'))
print(lps('abca'))
print(lps('abba'))
print(lps('abcba'))
print(lps('abda'))

结果为0, 1, 2, 3, 1

这些数字表示最长的前缀(反向顺序)也是后缀。

正如你所看到的,“abba”导致长度为2(因为“ab”),即使它是一个长度为4的回文。如果你想得到那个回文的总长度,它可能更容易迭代地做:

def lps_full(word):
  i = len(word)
  while i > 0:
    if word[:i] == word[:-i-1:-1]:
      return i
    i -= 1
  return 0

相同的例子导致0, 1, 4, 5, 1,即,对于非palindrom的单词,结果与上面相同,以及单词的单词长度。

如果强制要求,可以递归定义相同的函数:

def lps(word, i=0):
  if len(word) > i and word[i] == word[-i-1]:
    return lps(word, i+1)
  else:
    return i