Java程序在给定字符串中查找最长回文

时间:2020-01-09 10:35:33  来源:igfitidea点击:

在这篇文章中,我们将看到一个Java程序来查找给定字符串中最长的回文。在给定的字符串中,可能有不止一个回文,但是我们需要找出最长的一个并显示该回文。

为了找到字符串中最长的回文,我们需要从字符串的中间开始,左右移动一个字符并比较这些字符,如果这两个字符相等,则意味着我们有回文,并且我们执行相同的操作接下来的两个字符。例如,在字符串" 98189"中,中心是1,通过左右移动并进行比较,我们可以看到8和8以及9和9相等。同时,字符串的中心也会在程序中移动,因为我们必须在字符串中找到最长的回文。

要考虑的另一件事是String为偶数时,在这种情况下,我们将以两个字符为中心,然后进行字符比较。视为中心的两个字符也应相等。

Java程序寻找最长回文

public class LongestPal {
  public static void main(String[] args) {
    LongestPal lp = new LongestPal();
    System.out.println("Longest Palindrome- " + lp.findLongestPalindrome("12321981189"));
    System.out.println("Longest Palindrome- " + lp.findLongestPalindrome("toppot"));
    System.out.println("Longest Palindrome- " + lp.findLongestPalindrome("101312321"));
    System.out.println("Longest Palindrome- " + lp.findLongestPalindrome("101311321"));
  }
	
  public String findLongestPalindrome(String str) {
    // starting point for comparison with other palindromes
    String longestPalindrome = str.substring(0, 1);
    for (int i = 0; i < str.length(); i = i+1) {  
      // odd length case (center is i)
      String newPalindrome = checkIfEqual(str, i, i);
      if (newPalindrome.length() > longestPalindrome.length()) {
        longestPalindrome = newPalindrome;
      }
      // even length case (center is i, i+1)
      newPalindrome = checkIfEqual(str, i, i + 1);
      if (newPalindrome.length() > longestPalindrome.length()) {
        longestPalindrome = newPalindrome;
      }
    }	    
    return longestPalindrome;
  }
	
  public String checkIfEqual(String str, int begin, int end) {
    while ((begin >= 0 && end <= str.length() - 1) && (str.charAt(begin) == str.charAt(end))) {
      // move left
      begin--;
      // move right
      end++;
    }
    return str.substring(begin + 1, end);    
  }
}

输出:

Longest Palindrome- 981189
Longest Palindrome- toppot
Longest Palindrome- 12321
Longest Palindrome- 3113

该解决方案的时间复杂度为O(N2),空间复杂度为O(1),因为使用了相同的字符串,并且程序中的内存需求没有增加。