剑指 Offer 38. 字符串的排列
输入一个字符串,打印出该字符串中字符的所有排列。
例如,输入字符串abc,则打印出由字符a、b、c所能排列出来的所有字符串:
abc、acb
bac、bca
cab、cba
某店铺将用于组成套餐的商品记作字符串 goods,其中 goods[i] 表示对应商品。请返回该套餐内所含商品的 全部排列方式 。
返回结果 无顺序要求,但不能含有重复的元素。
示例 1:
输入:goods = “agew”
输出:[“aegw”,“aewg”,“agew”,“agwe”,“aweg”,“awge”,“eagw”,“eawg”,“egaw”,“egwa”,“ewag”,“ewga”,“gaew”,“gawe”,“geaw”,“gewa”,“gwae”,“gwea”,“waeg”,“wage”,“weag”,“wega”,“wgae”,“wgea”]
提示:
1 <= goods.length <= 8
思路
假设数据是abc,假设bc已经排序完毕(bc cb)
那么
在bc排序的基础上,左、中、右插入a,可得到:abc bac bca
在cb排序的基础上,左、中、右插入a,可得到:acb cab cba
即,在排序的基础上,插入a即可
class Solution {
public String[] goodsOrder(String goods) {
//边界条件
if(goods.length() == 0) return null;
//只有一个,就返回一个
if(goods.length() == 1) {
String [] resultArray = {goods};
return resultArray;
}
//设置集合,防止重复
Set<String> resultSet = new HashSet<>();
//取出最后一个字符
char lastChar = goods.charAt(goods.length() - 1);
//从0到去除最后一个字符的,子串
String subString = goods.substring(0, goods.length() - 1);
//假如,已经获取了从0到除最后一个字符的结果(数组)
String[] subStringResultArray = goodsOrder(subString);
//插入最后一个元素
//取出子字符串获取的结果里面的每一个string
for(int i = 0; i < subStringResultArray.length; i++){
//取出字符串
String itemString = subStringResultArray[i];
//建立StringBuffer,方便进行插入操作
StringBuffer itemStringBuilder = new StringBuffer(itemString);
//对每一个字符串进行操作
for(int j = 0; j <= itemStringBuilder.length(); j++){
//在j的位置上插入字符
String newString = new String(itemStringBuilder.insert(j, lastChar));
//结果加上新的拼接字符串
resultSet.add(newString);
//假如子串是bc, 在0处插入a,得到abc;a应该进行删除,然后再进行插入第1个位置,得到bac
//删除j处字符,相当于恢复原状
itemStringBuilder.deleteCharAt(j);
}
}
String[] resultArray = new String[resultSet.size()];
return resultSet.toArray(resultArray);
}
}