最初にコードを見てください
public class maxhuiwen {public static void main(string [] args){// todo auto-enerated method stub string s = "abb"; Maxhuiwen(s); } // 1。出力palindrome string public static void maxhuiwen(string s){// string int length = s.length(); // Storage最長のPalindrome String String MaxString = ""; //現在の文字列のすべてのサブストリングを(int i = 0; i <length; i ++){for(int j = i; j <length+1; j ++){string s1 = s.substring(i、j); //現在の文字列がパリンドローム文字列であり、マックスストリングの長さよりも大きい場合、現在のマックスストリングを交換する場合は、huiwen(s1)&& s1.length()> maxstring.length()){maxstring = s1; } //system.out.println(S1); }} // maxStringの長さが2以上の場合、それはパリンドロームの文字列であることを意味します。 } else {system.out.println( "palindrome string"); }} // 2。文字列がパリンドローム文字列であるかどうかを判断しますpublic static boolean huiwen(string s){boolean flag = true; int length = s.length(); char s1 [] = s.tochararray(); //後に、文字列をトラバースして(int i = 0、j = length-1; i <= j; i ++、j-){if(s1 [i]!= s1 [j]){flag = false; }} return flag; }}1。弦の牧歌的な判断
文字列がパリンドロームであるかどうかを判断します
問題の説明、文字列t = "madam"などの文字列が与えられます。文字列がパリンドロームであるかどうかを判断します
方法1:1。2つの文字列要素ポインターを定義します(Javaにはポインターの概念がないことに注意してください)、int right = t.length()-1; int left = 0;
2。つまり、左は左から始まり、右は右から始まり、紹介された文字が順番に等しいかどうかを比較します。それらが等しい場合、左++、右 - ;それ以外の場合は、背景ではなく直接返されます。
while(左<右){if(t.charat(左)!= t.charat(右))false;左++;右 - ;} return true;コード:
/ * 3: * Palindrome *問題説明:英語のパリンドロームのパリンドロームは、マダムなど、同じものを逆に読む文字列を指します。各「ポインター」によって指された値が等しい場合、これはパリンドローム*/パブリックブールイスパリンドローム(String s){if(s == null)falseを返します。 int left = 0; int right = s.length()-1; while(左<右){if(s.charat(左)!= s.charat(右))falseを返します。左++;右 - ; } trueを返します。 }方法2:「マダム」などのパスラー文字列。それらをすべて逆転させると、あなたはまだ独自の「マダム」を得るでしょう。 2つの文字列を比較するとき、それらが等しい場合、それはパステラーです。
1.文字列を反転する関数を実装します
/**文字列の反転関数を実装*/ private string Reverse(string str){string stresult = ""; for(int i = str.length() - 1; i> = 0; i-){strresult+= str.charat(i); } strensultを返します。 } 2。ターゲット文字列sの場合、最初に逆逆=逆(s)を逆にし、次にtemp.equals/** stringを反転させてから、元の文字列と比較します。それが等しい場合、それはパリンドロームです。そうでなければ *アルゴリズム時間の複雑さはO(n) */public boolean ispalindrome2(string s){string temp = reverse(s); if(s.equals(temp))return true; elsereturn false;}2:指定された文字列の最大パリンドローム文字列を見つける方法
たとえば、文字列t = "Google"を考えると、その最長のパリンドロームサブストリング「Goog」を見つける方法
1.最も単純で最も直接的なアイデアは、弦のすべてのサブストリングを見つけてから、各サブストリングがパリンドローム、記録、比較、最大長のパリンドロームを見つけるかどうかを判断することです。 *アルゴリズム時間の複雑さはO(n^3)です
/ * * 4、最も長いパリンドロームサブストリング *問題説明:文字列を指定して、Googleストリングなどのすべてのサブストリングの中で最も長いパリンドロームサブストリングを見つけます。最も長いサブストリングはGoog *分析です。 * 1、最も単純で最も直接的なアイデアは次のとおりです。 o(n^3) */ public string longestpalindrome1(string s){string result = null; string tempstring = ""; //最も長いパリンドロームサブストリングint max = 0の長さを定義します。 //文字列内のすべての要素を(int i = 0; i <s.length(); i ++){//配列subscript pointer jは、(int j = s.length() - 1; j> i; j-){// palindrome tempstring = s.substr(i、j+1)の文字列から前方に移動し始めます。 // TempStringがPalindromeサブストリングであり、その長さ(J-I+1)> Max if(IsPalindrome(Tempstring)&&(J-I+1)> max){max = j-i+1; result = substring(i、j+1); }}} return result; }2。2番目のアイデアは、すべてのキャラクターを文字列で判断することです
t [i]を中心とした偶数長さのサブストリング、t [i+1]はパリンドロームです
T [i] A Palindromeを中心とした奇数の長さのサブストリングです
public string longestpalindrome2(string t){string result = null; //保存する最大パリンドローム文字列int max = 0; //各文字を通り抜け、各文字を使用してパリティエクステンションのサブストリングをセンターのセンターとして判断します(int i = 0; i <t.length(); i ++){// 2つのアレイ添え字ポインターと、i、i+1 int pstart = i; int pend = i+1; while(pstart> = 0 && pend <=(t.length() - 1)&& t.charat(pstart)== t.charat(pend)){pstart--;ペンド++; } //サブストリング> maxの長さの場合、サブパリンドローム文字列の長さは一時的に最長のサブパリンドローム弦=(pend-1) - (pstart+1)-1 = pend-pstart-1> max){max = pend-pstart-1; result = substring(pstart+1、pend-1+1); } //中心としてiから、拡張された奇数シーケンスがPalindrome string pstart = i-1であるかどうかを判断します。 pend = i+1; while(pstart> = 0 && pend <=(t.length() - 1)&& t.charat(pstart)== t.charat(pend)){pstart--;ペンド++; } if(pend-pstart-1> max){max = pend-pstart-1; result = substrint(t、pstart+1、pend-1+1); }} return result; }