問題:
ソリューション:
この問題は見つけることであることに注意してください最長の共通のプレフィックスを
水平走査
パッケージcom.example.demo; パブリック クラスTest14 { / ** *最長の文字列配列の共通の接頭辞を検索** ** * * @paramのSTRを * @return * / パブリック文字列longestCommonPrefix(String []型のSTR){ / / 水平走査 IF(STRの== NULL || strs.length == 0 ){ リターン "" ; } 文字列の接頭辞 =のSTR [0 ]; のための(INT I = 1; I <strs.length; I ++は){ / /各プレフィックスの検索文字列、文字列Bの先頭ではなく、先頭の文字列Aは、その後、prefix--、再クエリは、制動が空に終了したため、 しばらく(STRを[I] .indexOf(接頭辞)! 0 = ){ 接頭辞 = prefix.substring(0、prefix.length() - 1 )、 IF (prefix.isEmpty()){ リターン "" ; } } } 戻りプレフィックス; } パブリック 静的 ボイドメイン(文字列[]引数){ Test14 T = 新しい新しいTest14(); 文字列[]の文字列 = { "ABCD"、 "ABC"、 "AB&" }; 文字列s =t.longestCommonPrefix(文字列); System.out.println(S); } }
法律の第二に、ブランチ
パッケージcom.example.demo、 パブリック クラスTest14 { / ** *最長文字列配列の共通プレフィックスを検索** * * @return * / パブリック文字列longestCommonPrefix1(String []型のSTR){ // 分割統治 IF(STRの== NULL || strs.length == 0 ){ リターン "" ; } 戻り longestCommonPrefix1(STRの、0、strs.length - 1 ); } / ** *再帰的なパーティション * * @param用のSTR * @param 左 *@paramの右 * @return * / プライベート文字列longestCommonPrefix1(String []型STRを、int型、左int型{右) // 再帰終了条件 のIF(左== 右){//再帰終了条件が良い選択することである リターンのSTRを[左]; } 他{ int型ミッド=(左+右)/ 2 ; // 再帰アイデア(再帰のような、限りマクロのものと、再帰戻り列は、最長共通ミッド間残されていない深い内部接頭辞) 文字列lcpLeft = longestCommonPrefix1(STRの、左、MID); 文字列lcpRight = longestCommonPrefix1(STRの、MID + 1。、右); // 左と右の2つの最長共通文字列比較の復帰、最終取得する最長の共通のプレフィックス リターンcomparePreFix(lcpLeft、lcpRightは); } } / ** *二つの文字列の最長を比較します接頭 * * @param lcpLeft * @param lcpRight * @return * / プライベートストリングcomparePreFix(lcpLeft文字、文字列lcpRight){ int型 LEN = Math.min(lcpLeft.length()、lcpRight.length()); のため(int型 I 0 =; IはLEN <; Iは++ ){ IF(lcpLeft.charAt(I)=!lcpRight.charAt(I)){ 戻り lcpLeft.substring(0 、I)。 } } 戻り lcpLeft.substring(0 、LEN)。 } パブリック 静的 ボイドメイン(文字列[]引数){ Test14 T = 新しいTest14()。 文字列[]の文字列 = { "ABCD"、 "ABC"、 "AB" }。 文字列s = t.longestCommonPrefix1(文字列); System.out.println(S); } }