今天遇到的笔试题,时间紧张没有想出来。笔试完后总结一下解决方法。
题目如下:
给出一个字符串例如:”abc“,输出组成该字符的字母组成的所有组合。上例:a,b,c,ab,ac,bc,abc;
以abcde为例来解释,abc的组合的元素个数从1-5个;
分别为a b c d e ab ac ad ae bc bd be cd ce abc abd abe acd ace ade bcd bce bde cde;
对于有多个元素的子元素,每次都是移动后边的元素,比如,abc,abd, abe 直到元素不能移动为止,然后移动前一个相邻的,acd ace ,继续ade,第二个元素也到达最后,开始移动第一个,bcd bce bde。
总之每次后边元素的移动都是从前一个元素的下一个元素开始。移动到不能移动为止(str.length - n + index)
(不能移动的位置为:字符总长度减去子元素长度,加上第一个此类子元素开始位置,例如子元素长度为3,第一个子元素为abc,那么b的结束为止为5-3+1,1位b的下标);
然后用回溯法实现
public class LetterCombineTest {
public static int count = 0;
public static void main(String[] args) {
String str = "abcdefg";
new LetterCombineTest().printLetterCombine(str);
System.out.println();
System.out.println(count);
}
public void printLetterCombine(String str){
int n = str.length();
for(int i = 1; i <= n; i ++){
char [] s = new char[i];
getLetterCombine(s,0,0,i,str);
}
}
public void getLetterCombine(char []s, int index, int starti, int n, String str){
int length = str.length();
for(int i = starti; i <= length - n + index; i ++){
s[index] = str.charAt(i);
if(index == n - 1){
for(int j = 0 ; j < n; j++){
System.out.print(s[j]);
}
System.out.print(" ");
count++;
continue;
}
getLetterCombine(s,index + 1, i+1, n,str);
}
}
}