题目的链接在这里:https://www.nowcoder.com/practice/fe6b651b66ae47d7acce78ffdd9a96c7
题目大意
输入一个长度为 n 字符串,打印出该字符串中字符的所有排列,你可以以任意顺序返回这个字符串数组。 例如输入字符串ABC,则输出由字符A,B,C所能排列出来的所有字符串ABC,ACB,BAC,BCA,CBA和CAB。一、示意图
二、解题思路
DFS
DFS
代码如下:
import java.util.ArrayList;
public class Solution {
public ArrayList<String> Permutation(String str) {
//输入长度为n的字符串 打印他所有的排列组合
ArrayList<String> arrayList=new ArrayList<>();
if(str.length()==0)
return arrayList;
//感觉是需要用到dfs
char[] chars = str.toCharArray();
boolean isVisited[]=new boolean[chars.length];
StringBuffer stringBuffer=new StringBuffer();
int len=0;
dfs(len,arrayList,chars,isVisited,stringBuffer);
return arrayList;
}
private void dfs(int len, ArrayList<String> arrayList, char[] chars, boolean[] isVisited, StringBuffer stringBuffer) {
//使用len进行判断
if(len>=chars.length){
//说明一次循环结束了
//可以进行插入了 查重判断
if(!arrayList.contains(new String(stringBuffer.toString()))) {
arrayList.add(new String(stringBuffer.toString()));
}
//就可以跳出循环了
return;
}
//不然的话 就进行访问 把他没有访问过的 都插入 然后修改成访问过的 然后在进行修改
for(int i=0;i<isVisited.length;i++){
if(!isVisited[i]){
//说明他没有被访问过 那就修改他
isVisited[i]=true;
//然后len加一
len++;
//然后开始遍历 遍历结束就开始判断
stringBuffer.append(chars[i]);
dfs(len,arrayList,chars,isVisited,stringBuffer);
//然后再还原
stringBuffer.deleteCharAt(stringBuffer.length()-1);
isVisited[i]=false;
//这里需要修改吗
len--;
}
}
}
}