大厂面试题目 - String中字符排列组合相关面试题目

面试题目 - String 相关


输入一个字符串,打印输出该字符串中字符的所有排列。你可以任意顺序返回这个字符串数组,但里面不能有重复元素。

示例:

输入: s = “abc”;

输出:[“abc”,“acb”,“bac”,“bca”,“cab”,“cba”]

限制:1 <= s 的长度 < = 8

import java.util.Arrays;
import java.util.Scanner;

public class Test {
    
    
	public static void main(String[] args) {
    
    
		
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入一个长度 8 以内的字符串:");
		
		String str = sc.next();
		
		if(str.length()>=1 && str.length()<=8) {
    
    
			
	//		String str = "abc";
			//先将一个字符放到结果集中
			String[] result= new String[1];
			result[0]=str.substring(0, 1);
			//遍历截取字符串 ,用之前的结果集,和下一个字符重新生成新的结果集
			for (int i = 1; i < str.length(); i++) {
    
    
				result=test(result,str.substring(i, i+1));
			}
			for (int i = 0; i < result.length; i++) {
    
    
				System.out.println(result[i]);
			}
			System.out.println(result.length);
		}else {
    
    
			System.out.println("请输入一个长度1~8的字符串");
		}
	}
	
	//将数组中的所有元素,和字符a拼接,生成新的结果
	public static String[] test(String[] source,String a) {
    
    
		//新结果集的最大长度为拼接后字符串的长度乘以之前结果集的长度
		int lenght=source.length*(source[0].length()+1);
		String[] result= new String[lenght];
		//记录数据存放的角标
		int s=0;
		//遍历当前结果的每个元素
		for (String string : source) {
    
    
			//循环将字符a 插入到字符串的每个位置
			for (int j = 0; j < string.length()+1; j++) {
    
    
				String b=string.substring(0, j)+a+string.substring(j, string.length());
				//因为字符串中的可以重复,可能会出现重复结果,所以先判断是否已包含此结果
				if(!contains(result,b)) {
    
    
					result[s]=b;
					s++;
				}
			}
		}
		//因为之前创建的数组长度为可能的最大长度,所以在最后截取用到的长度的数组返回
		String[] copyOf = Arrays.copyOf(result, s);
		return copyOf;
	}
	
	 // 判断是否已包含此结果
	public static boolean contains(String[] result,String str) {
    
    
		for (int i = 0; i < result.length; i++) {
    
    
			if(str!=null&&result[i]!=null&&result[i].equals(str)) {
    
    
				return true;
			}
		}
		return false;
	}
}

猜你喜欢

转载自blog.csdn.net/Java_lover_zpark/article/details/105422939