最長迴文子序列 遞歸算法

<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。
    	
    }



發佈了31 篇原創文章 · 獲贊 2 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章