【Java】力扣 - 刷题笔记 - 面试题 08.07
【Java】力扣 - 刷题笔记 - 面试题 08.07
每日一道题,提升一点点
题目介绍
面试题 08.07. 无重复字符串的排列组合
无重复字符串的排列组合。编写一种方法,计算某字符串的所有排列组合,字符串每个字符均不相同。
示例1:
输入:S = "qwe"
输出:["qwe", "qew", "wqe", "weq", "ewq", "eqw"]
示例2:
输入:S = "ab"
输出:["ab", "ba"]
提示:
- 字符都是英文字母。
- 字符串长度在[1, 9]之间。
解题思路
- 1.题目分析
这题看起来比较简单:也就是将一个字符串的所有字符排列组合成一个个不同字符串,然后存储到数组中
这里面有几个关键点:字符都是英文字母,且字符串的字符无重复
根据数学的排列组合原理:目标数组的长度 = 字符串长度的阶乘
我们首先需要写一个求数据阶乘的方法
// 求数据的阶乘并返回
public int getFactorial(int i) {
int factorial = 1;
while (i > 1) {
factorial = factorial * i;
i--;
}
return factorial;
}
然后我们就可以初始化目标数组了,现在关键是怎么把字符排列组合放到数组中
我们可以这样设计:循环遍历字符长度,将右边字符串的一个字符逐个拿给左边,然后将右边字符串的该字符删掉(替换为空),最后当右边只有一个字符的时候,左右拼接的就是我们需要的字符串了
// 初始化处理字符串函数,res:目标数组,str1:左边的字符串,str2:右边的字符串
public void solvedStr(String[] res, String str1, String str2) {
// 处理后左边的字符串
String left= "";
// 处理后右边的字符串
String rigth= "";
for(int i = 0; i < str2.length(); i++){
// 左边的字符串 = 原来左边的字符串 + 一个字符
left= str1 + String.valueOf(str2.charAt(i));
// 右边的字符串 = 原来右边的字符串 - 那个字符
rigth= str2.replace(String.valueOf(str2.charAt(i)),"");
// 如果原来右边的字符串长度已经为1,则将现在左边的字符串赋值给目标数组,否则递归继续
if (str2.length() == 1){
res[index] = left;
// 目标数组的索引需要定义一个全局变量
index++;
} else {
solvedStr(res, left, rigth);
}
}
}
最后再调用下我们设计的方法执行下就好了
class Solution {
// 初始化一个全局变量索引
private static int index = 0;
public String[] permutation(String S) {
// 初始化索引为0
index = 0;
// 初始化目标数组
String[] res = new String[getFactorial(S.length())];
// 处理S字符串,左边字符串为空
solvedStr(res, "", S);
return res;
}
// 初始化处理字符串函数,res:目标数组,str1:左边的字符串,str2:右边的字符串
public void solvedStr(String[] res, String str1, String str2) {
// 处理后左边的字符串
String left= "";
// 处理后右边的字符串
String rigth= "";
for(int i = 0; i < str2.length(); i++){
// 左边的字符串 = 原来左边的字符串 + 一个字符
left= str1 + String.valueOf(str2.charAt(i));
// 右边的字符串 = 原来右边的字符串 - 那个字符
rigth= str2.replace(String.valueOf(str2.charAt(i)),"");
// 如果原来右边的字符串长度已经为1,则将现在左边的字符串赋值给目标数组,否则递归继续
if (str2.length() == 1){
res[index] = left;
// 目标数组的索引需要定义一个全局变量
index++;
} else {
solvedStr(res, left, rigth);
}
}
}
// 求数据的阶乘并返回
public int getFactorial(int i) {
int factorial = 1;
while (i > 1) {
factorial = factorial * i;
i--;
}
return factorial;
}
}
- 2.提交结果