打印数目
Description
小硕有一套字母表arr,其中每个上都刻有一个字母arr[i]。返回小硕可以印出的非空字母序列的数目。
注意:本题中,每个字母只能使用一次。
Input
输入字符串arr
1≤arr.length≤7
Output
输出可打印数目
Sample
代码
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;public class Main {static BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));static int count = 0;public static void main(String[] args) throws IOException {String s = reader.readLine();ArrayList<Character> choice = new ArrayList<>();for(int i = 0;i<s.length();i++){choice.add(s.charAt(i));}Collections.sort(choice);backtrack(choice);System.out.println(count);}public static void backtrack(ArrayList<Character> choice){char flag = 0;for(int i = 0;i<choice.size();i++){Collections.sort(choice);char c = choice.get(i);if(c != flag){choice.remove(i);count++;backtrack(choice);choice.add(c);}flag = c;}}}
思路
使用回溯法,与一般对层数迭代不同,这里直接使用数组进入排序,减少了使用全局变量等工作量
每次进行sort排序,是为了将c加入后进入正确的位置,保证恢复现场