(整理)给定一个字符串,求这个字符串的最大回文数

更新时间:2023-05-10 18:31:20 阅读: 评论:0

题目:回文判断是一类典型的问题,尤其是与字符串结合后呈现出多姿多彩,在实际应用中比较广泛,下面介绍几个回文的问题。
首先我们要介绍一个什么叫回文数:回文,就是指一个字符串顺着读和反着读都是一样的字符串,例如madam,你我你,我爱我  等等一些列的字符串
1、首先来判断一下一个字符串是否是回文字符串:
[java] view plaincopyprint?
1 public int palindromeNumber(String s, int low, int high) { 
2         if (low == high) 
3             return 1
4         el if (low < high) { 
5             if (s.charAt(low) == s.charAt(high) && (high - low) == 1) //防止出现abba等情况  
6                 return 1
7             if (s.charAt(low) == s.charAt(high) && (high - low) != 1//这是类似aba的情况 
8                 return palindromeNumber(s, low + 1, high - 1); 
9             el 
10                 return 0
11         } el 
12             return 0
13     } 

上面的这个方法,如果输入的字符串是回文字符串的话,则输出1,如果不是的话,输出0
2、已经明白了如何判断一个字符串是否是回文数,接下来我们就要求出一个给定字符串中最大的回文数是多少,就是把这个回文数的长度打出来
[java] view plaincopyprint?
14 package programmer; 
15  
16 import java.util.Scanner; 
17  
18 /*
19 * 回文判断是一类典型的问题,尤其是与字符串结合后呈现出多姿多彩,在实际中使用也
20 * 比较广泛,而且也是面试题中的常客,所以本文就结合几个典型的例子来体味下回文之趣。
21 回文,英文palindrome,指一个顺着读和反过来读都一样的字符串,比如 madam
22 我爱我,这样的短句在智力性、趣味性和艺术性上都颇有特色,中国历史上还有很多
23 有趣的回文诗呢 
24 */ 
25 public class PalindromeNumber { 
26  
27     public int palindromeNumber(String s, int low, int high) { 
28         if (low == high) 
29             return 1
30         el if (low < high) { 
31             if (s.charAt(low) == s.charAt(high) && (high - low) == 1
32                 return 1
33             if (s.charAt(low) == s.charAt(high) && (high - low) != 1
34                 return palindromeNumber(s, low + 1, high - 1); 
35             el 
36                 return 0
37         } el 
38             return 0
39     } 
40  
41     /*
42     * 这里求一个字符串中的最长回文字符串的长度,我们使用了枚举的方法,但是这 种方法的时间复杂度还是很大的,浪费了很多不必要的时间和判断,比如当判断
43     * 子串 不是回文时, 就不必要再判断包含本子串的父串了
44     */ 
45     public int maxPalindrome1(String s) { 
46         int len = 0, max = 0
47         for (int i = 0; i < s.length(); i++) { 
48             for (int j = s.length() - 1; j >= i; j--) { 
49                 if (palindromeNumber(s, i, j) == 1) { 
50                     len = j - i + 1
51                 } 
52                 if (max < len) 
53                     max = len; 
54             } 
55         } 
56         return max; 
57     } 
58  
59     public static void main(String[] args) { 
60         Scanner sc = new Scanner(System.in); 
61         String s = sc.nextLine(); 
62         System.out.println(new PalindromeNumber().palindromeNumber(s, 0
63                 s.length() - 1)); 
64         System.out.println(new PalindromeNumber().maxPalindrome1(s)); 
65     } 
66

上面的思想也十分简单,就是逐个遍历,显然这是十分耗费时间的,时间复杂度为O(n*n*n),因为还要判断这个是否是回文数,所以比较浪费时间。接下来我们提供一种比较有建设性的方法。
3、我们知道回文数是正着读和反着读是一样的,就是说对于一个给定的字符串,如果我们将这个字符串逆置的话,我们就会发现两个字符串有一个最长的连续相同的子序列,则这个连续的最长的共同子序列就是我们要求的回文数,例如:abcabcba,反过来就是abcbacba,显然我们发现两个字符串连续的最长的共同子序列就是abcba,而abcba就是我们索要求的最长的回文数。
下面是这个源代码:
[java] view plaincopyprint?
67 package programmer; 
68  
69 import java.util.Scanner; 
70  
71 public class PalindromeNumber1 { 
72     StringContain obj = new StringContain(); 
73  
74     public int Max(String s1, String s2) { 
75         int max = 0
76         for (int i = 0; i < s1.length(); i++) { 
77             for (int j = s2.length(); j > i; j--) { 
78                 if (obj.stringContain(s1, s2.substring(i, j)) == 1) { 
79                     if (max < j - i) 
80                         max = j - i; 
81                 } 
82             } 
83         } 
84         return max; 
85     } 
86  
87     public String reverString(String s) { 
88         char[] c = new char[s.length()]; 
89         c = s.toCharArray(); 
90         for (int i = 0, j = c.length - 1; i < j; i++, j--) { 
91             char ch = c[i]; 
92             c[i] = c[j]; 
93             c[j] = ch; 
94         } 
95         return String.valueOf(c); 
96     } 
97  
98     public static void main(String[] args) { 
99         Scanner sc = new Scanner(System.in); 
100         String s1 = sc.nextLine(); 
101         // System.out.println(s1.subSequence(0, s1.length() - 1)); 
102         String s2 = new PalindromeNumber1().reverString(s1); 
103         System.out.println(s2); 
104         System.out.println(new PalindromeNumber1().Max(s1, s2)); 
105     } 
106
而其中我们用到了stringContain()方法,这是我写的判断一个字符串是否包含另外一个字符串的算法,代码如下:
[java] view plaincopyprint?
107 package programmer; 
108  
109 import java.util.Scanner; 
110  
111 /*
112 * 这是判断字符串s1中是否包含字符串s2
113 */ 
114  
115 public class StringContain { 
116     public int stringContain(String s1, String s2) { 

本文发布于:2023-05-10 18:31:20,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/574892.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:字符串   判断   时间   包含
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图