LeetCode:リカバリーIPアドレス[93]
タイトル説明
与えられた文字列は、それを復元し、数値のみ含まれており、すべての可能なIPアドレスの形式を返します。
例:
入力: "25525511135"
出力:[ "255.255.11.135"、 "255.255.111.35 "]
トピック分析
IPアドレスは、3つのピリオド(。)は、4つのセグメント、0から255までの範囲の各セグメントに分割されて構成されています。したがって、最大12秒の入力文字列は、4つの最低。
2556 ....分割する、次の3つの条件のうちの最初の段落が存在してもよいです。
- 255、のパラグラフ3
- 25、第2項は、
- 2、第1項の
傍受例一定期間は、次の2つ運ぶために継続していないのであれば、再帰的な枠組み、特定の位置から、3,2,1の傍受を元に戻す、しかし:
- > 255、255は、このセクションよりも大きい不適切であり、このセクションでは、説明の長さが3で取られるべきではありません。
- 0XXまたは0Xは、この段落の先頭が0である場合、それは不合理である、段落の説明は、すなわち、別の段落のように0 1であることができる2または3の長さとして解釈されるべきではありません。
即剪枝条件:不能以0开头,不能大于255.
問題のJavaソリューション
クラスソリューション{ パブリックリストの<string> restoreIpAddresses(文字列S){ リストの<string>結果=新規のArrayList <>(); (s.length()> 12 || s.length()<4)の場合は リターン結果。 digui(その結果、S、0,0)。 結果を返します。 } パブリック無効digui(一覧<文字列>リスト、文字列TMP、int型のPOS、int型のカウント数){ //结束条件 であれば(== 3カウント){ 場合(POS + 3> tmp.length() - 1 &&のisValid(tmp.substring ( "" tmp.lastIndexOf()+ 1))) list.add(TMP)。 } //业务处理 digui(リスト、thirdTmp、 場合(POS + 3 <tmp.length()&&はisValid(tmp.substring(POS、POS + 3))){ ストリングthirdTmp = tmp.substring(0、POS + 3)+(POS + 3)tmp.substring + ""; } IF(POS + 2 <tmp.length()&&はisValid(tmp.substring(POS、POS + 2))){ 文字列secondTmp = tmp.substring(0、POS + 2)+ "" tmp.substring +(POS +2)。 digui(リスト、secondTmp、POS + 3、+ 1カウント)。 } IF(POS + 1 <tmp.length()){ 文字列firstTmpは= tmp.substring(0、POS + 1)+(POS + 1)tmp.substring + ""; digui(リスト、firstTmp、POS + 2、+ 1カウント)。 } } パブリックブールのisValid(文字列S){ int型のval = Integer.valueOf(S)。 (ヴァル> 255)があれば falseを返します。
//用于处理0XX或0X的情况 であれば(String.valueOf(ヴァル).equals(S)!) falseを返します。 trueを返します。 } }
考えます
暴力は通常、最も効率的な方法で問題を解決し、確かにすることはできません、文字列のためにあまりにも多くのメモリと処理時間を取ってここに。それを行うには良い方法はありますか?
つづきます...