持っているイテレータクラスを設計します。
- 文字列受け取るコンストラクタ
characters
ソートされた個別の小文字の英文字と数字のcombinationLength
引数としてを。 - 機能 次の() 長さの次の組み合わせを返す
combinationLength
辞書式順序に。 - 関数 のhasNext() 戻りことを
True
次の組み合わせが存在する場合にのみ。
例:
CombinationIteratorイテレータ=新CombinationIterator( "ABC"、2); //イテレータを作成します。 iterator.next(); //戻り、 "AB" iterator.hasNext(); // trueを返します iterator.next(); //戻り、 "AC" iterator.hasNext(); // trueを返します iterator.next(); //戻り "BC" iterator.hasNext(); //返す偽
制約:
1 <= combinationLength <= characters.length <= 15
- せいぜいがあります
10^4
テストあたりの関数呼び出し。 - 関数のすべてのコールがあることが保証だ
next
有効です。
クラスCombinationIterator { 優先度つきキュー PQ = <文字列> 新しい優先度つきキュー<> (); 公共 CombinationIterator(文字列s、int型K){ generateSub(S、K、 0、新規のStringBuilder())。 } プライベート 無効 generateSub(のString、int型 lenは、int型開始、StringBuilderの結果){ 場合(LEN == 0 ){ ()(result.toString)pq.add。 リターン; } 用(INT ; - ; iは++ lenのI <= s.length()iは=開始{) result.append(s.charAt(I)); generateSub(S、lenを -1、I + 1 、結果)。 result.deleteCharAt(result.length() -1 )。 } } 公共次の文字列(){ 戻りpq.poll()。 } パブリック ブールのhasNext(){ リターン!pq.isEmpty(); } }
クラスCombinationIterator { キュー <文字列> QU = 新しいLinkedListの(); 文字列ORIG = "" ; 公共 CombinationIterator(文字列の文字、int型combinationLength){ ORIG = 文字。 (見つける ""、0 、combinationLength)。 } ボイド検索(文字列str、INTインデックス、INT LEN){ 場合(LEN == 0 ){ qu.add(STR)。 リターン; } 以下のために(INT iがインデックスを=; I <orig.length(); I ++ ){ チャー CH = orig.charAt(I)。 (STR見つける + CH、私がlen-1を、1 + ); } } 公共次の文字列(){ 場合(!qu.isEmpty()){ リターンqu.poll(); } 戻ります「」; } パブリック ブールのhasNext(){ リターン!qu.isEmpty(); } }