【Java】力扣 - 刷题笔记 - 面试题 08.07

【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.提交结果
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_35132089/article/details/108124541