自己写的一段小代码,感觉思路还算明确,但是写的代码水准不是太高,留给有需要的小伙伴一起学习~附上代码:
import java.util.Scanner;
public class TestHuiWen {
public static void main(String[] args) {
String str;
System.out.println("请输入字符串:");
Scanner reader = new Scanner(System.in);
str = reader.next();
reader.close();
forHuiWen(str);
}
/**
* 输出一个字符串的最长回文序列
* @param str
*/
private static void forHuiWen(String str) {
String temp = null;
String []s= new String[100];
int max =0,length=0,j=0,flag=0;
for(int i=0;i<str.length();i++){
temp = str.substring(i, str.length());
length = forLonger(temp).length();
if(length!=1){
s[j] = forLonger(temp);
if(length>max){
max = length;
flag = j;
}
// System.out.println(forLonger(temp));
j++;
}
}
System.out.print(str+"的最长回文序列的长度为"+max);
System.out.println(",该序列为:"+s[flag]);
}
/**
* 返回一个字符串中以字符串第一个字符为首字符的最长回文
* 例如 输入 abcdcbade,返回 abcdcba
* @param str
* @return
*/
private static String forLonger(String str) {
if(isHuiWen(str)){
return str;
}else{
return forLonger(str.substring(0, str.length()-1));
}
}
/**
* 创建一个方法,判断一个字符串是否是回文
* @param str
* @return
*/
private static boolean isHuiWen(String str) {
char[] ch = str.toCharArray();
boolean flag = true;
int length = ch.length;
for(int i=0;i<ch.length/2;i++){
if(ch[i]!=ch[length-1]){
flag = false;
}
length--;
}
return flag;
}
}
另外附上某一大神的 经典算法——最长回文子序列
是C语言编写的,留给以后看。
原文http://blog.csdn.net/geekmanong/article/details/51056375#
#include<iostream>
#include<algorithm>
using namespace std;
//动态规划求解最长回文子序列,时间复杂度为O(n^2)
int lpsDp(char *str, int n)
{
int dp[10][10], tmp;
memset(dp, 0, sizeof(dp));
for (int i = 0; i < n; ++i) dp[i][i] = 1;
for (int i = 1; i < n; ++i)
{
tmp = 0;
//考虑所有连续的长度为i+1的子串,str[j....j+i]
for (int j = 0; j + i < n; j++)
{
//如果首尾相同
if (str[j] == str[j + i])
tmp = dp[j + 1][j + i - 1] + 2;
//如果首尾不同
else
tmp = max(dp[j + 1][j + i], dp[j][j + i - 1]);
dp[j][j + i] = tmp;
}
}
return dp[0][n - 1]; //返回字符串str[0...n-1]的最长回文子序列长度
}
int main()
{
char str[10] = "cabbeaf";
int res = lpsDp(str, strlen(str));
cout << res << endl;
getchar();
return 0;
}