题目描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
输入描述:
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
解决:思路是用的回溯法,每层锁定一个。
具体代码及注释如下:
import java.util.ArrayList;
import java.util.TreeSet;
public class Solution {
ArrayList<String> result = new ArrayList<>();
TreeSet<String> set = new TreeSet<>();//使用一个TreeSet保证有序和无重复
public ArrayList<String> Permutation(String str) {
char [] strArray = str.toCharArray();
Permutation(strArray,0);//参数不同是重载
while(!set.isEmpty())
result.add(set.pollFirst());//set.pollFirst()获取并移除第一个(最低)元素
//利用TreeSet存储字符串,消除重复,最后以while循环赋给ArrayList
return result;
}
public void Permutation(char [] strArray,int index)
{
if(index == strArray.length - 1)
{//这里的话就是每当到了最后一个字符的时候,就添加当前字符串,也是递归出口
//因为是strArray中元素互换得到的新字符串,所以直接把strArray转换成string类,存起来就好
set.add(String.valueOf(strArray));
}else{
for(int i=index;i<strArray.length;i++)
{
swap(strArray,index,i);
Permutation(strArray,index+1);//递归了下方所有层,递归到底的时候已添加字符串
swap(strArray,index,i);//回到上一层初始状态,再去交换index与i+1
}
}
}
public void swap(char [] strArray,int i,int j)
{
char ch = strArray[i];
strArray[i] = strArray[j];
strArray[j] = ch;
}
}
另外一点注意事项:
方法重载是指同一个类中的多个方法具有相同的名字,但这些方法具有不同的参数列表,即参数的数量或参数类型不能完全相同
方法重写是存在子父类之间的,子类定义的方法与父类中的方法具有相同的方法名字,相同的参数表和相同的返回类型
注:
(1)子类中不能重写父类中的final方法
(2)子类中必须重写父类中的abstract方法
转换为string类的方法总结:
1、toString,需要保证调用这个方法的类、方法、变量不为null,否则会报空指针。
2、String.valueOf。这个方法在使用的时候是有些特殊的。一般情况下,如果是确定类型的null传入,返回的是字符串“null”,而如果直接传入null,则会发生错误。
3、(String) 字符串类型强转。需要保证的是类型可以转成String类型。