文字列は S
単語のリストを表します。
単語内の各文字は、1つのまたは複数のオプションがあります。一つの選択肢がある場合は、文字はそのまま表現されています。複数のオプションがある場合、中括弧は、オプションを区切ります。たとえば、 "{a,b,c}"
オプションを表します ["a", "b", "c"]
。
たとえば、 "{a,b,c}d{e,f}"
リストを表します ["ade", "adf", "bde", "bdf", "cde", "cdf"]
。
辞書順に、このようにして形成することができるすべての単語を返します。
アイデア:;取る、コアアイデアは、リサイクルのために収集さ満たしブラケットにあり、その後、前方にインデックスを移動し続けるDFS、ブラケット、および収集し、その後、ループのため、この質問は、カンマをスキップするために使用さCharacter.isLetterを、学ばなければなりませんインデックス== s.lengthまで行きます();
class Solution {
public String[] expand(String S) {
if(S == null || S.length() == 0) {
return new String[0];
}
List<String> list = new ArrayList<String>();
StringBuilder sb = new StringBuilder();
dfs(S, list, 0, sb);
return convert(list);
}
private String[] convert(List<String> list) {
String[] res = new String[list.size()];
for(int i = 0; i < list.size(); i++) {
res[i] = list.get(i);
}
return res;
}
private void dfs(String S, List<String> list, int index, StringBuilder sb) {
if(index == S.length()){
if(sb.length() > 0) {
list.add(new String(sb.toString()));
}
return;
}
char c = S.charAt(index);
if(c == '{') {
List<Character> chars = new ArrayList<Character>();
int endindex = index+1;
while(endindex < S.length() && S.charAt(endindex) != '}'){
if(Character.isLetter(S.charAt(endindex))) {
chars.add(S.charAt(endindex));
}
endindex++;
}
Collections.sort(chars);
for(Character a : chars) {
sb.append(a);
dfs(S, list, endindex+1, sb);
sb.deleteCharAt(sb.length() -1);
}
} else if(Character.isLetter(c)) {
sb.append(c);
dfs(S, list, index+1, sb);
sb.deleteCharAt(sb.length() -1);
}
}
}