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

   日期:2020-08-22     浏览:159    评论:0    
核心提示:【Java】力扣 - 刷题笔记 - 面试题 08.07【Java】力扣 - 刷题笔记 - 面试题 08.07题目介绍解题思路【Java】力扣 - 刷题笔记 - 面试题 08.07每日一道题,提升一点点题目介绍面试题 08.07. 无重复字符串的排列组合无重复字符串的排列组合。编写一种方法,计算某字符串的所有排列组合,字符串每个字符均不相同。示例1: 输入:S = qwe 输出:[qwe, qew, wqe, weq, ewq, eqw]示例2: 输入:S

【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.提交结果
 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服