<pre name="code" class="html">public static void main(String[] args)
{
// try {
// BufferedReader strin=new BufferedReader(new InputStreamReader(System.in));
// System.out.print("請輸入一個字符串:");
// String str = strin.readLine();
//
// System.out.println("第一個:"+str);
//
// System.out.println("請輸入第二個字符串:");
// String str2 = strin.readLine();
// System.out.println("第2個:"+str2);
// } catch (IOException e) {
// e.printStackTrace();
// }
Scanner sc = new Scanner(System.in);
System.out.println("輸入一個字符串:");
// System.out.println("輸入字符串:"+sc.next());
String str = sc.next();
StringBuilder result = new StringBuilder();
int length = GetHuiWen(result, str);
System.out.println("result:" + result + " length:" + length);
}
public static int GetHuiWen(StringBuilder result, String src){
if (src == null || result == null) {
return -1;
}
int length = src.length();
if (length == 0) { //若長度爲0
return 0;
}
if (length == 1) { //若長度爲1,返回0,已與e099中99的情況區分開
result.append(src.charAt(0));
return 0;
}
if (length == 2) { //若長度爲2,且爲兩個字符相等,返回1,即已e099中99這種情況
if (src.charAt(0) == src.charAt(1)) {
result.append(src.charAt(0));
return 1;
}
}
// if (length == 3) {
// if ((src.charAt(0) == src.charAt(1) && src.charAt(1) != src.charAt(2))
// || (src.charAt(2) == src.charAt(1) && src.charAt(1) != src.charAt(0))) {
// result.append(src.charAt(1));
// return 1;
// }
// }
if (src.charAt(0) == src.charAt(length - 1)) { //若首尾字符相等,將首尾字符去掉,繼續遞歸尋找回文
result.append(src.charAt(0));
GetHuiWen(result, src.substring(1, length - 1));
return result.length();
}
else { //若首尾字符不相等,將首尾分別去掉一個字符,繼續遞歸尋找回文
StringBuilder si = new StringBuilder();
StringBuilder sj = new StringBuilder();
int i = GetHuiWen(si, src.substring(0, length - 1)); //得到迴文長度,來選擇最長的迴文
int j = GetHuiWen(sj, src.substring(1, length));
result.append(i >= j ? si : sj);
return i>=j ? i : j; //返回i,j而不返回result.length()是爲了傳遞長度值以區分e099時隨分別是e和9,
} //但返回9時的長度是1,e時是0。
}
最長迴文子序列 遞歸算法
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.