给定一个字符串str,任务是打印str的所有不同排列。
【Java程序打印字符串的不同排列】排列是一组对象的全部或部分的排列,就排列顺序而言。
例如,单词“bat”和“tab”代表了一个相似的三个字母单词的两种不同的排列(或安排)。
例子:
输入:str ="abbb"方法:编写一个递归函数, 该函数将生成字符串的所有排列。终止条件为传递的字符串为空时, 在这种情况下该函数将返回一个空数组列表。在添加生成的字符串之前, 只需检查它是否已经生成即可获取不同的排列。
输出:[abbb, babb, bbab, bbba]
输入:str ="abc"
输出:[abc, bac, bca, acb, cab, cba]
下面是上述方法的实现:
//Java implementation of the approach
import java.util.ArrayList;
public class GFG {//Function that returns true if string s
//is present in the Arraylist
static boolean isPresent(String s, ArrayList<
String>
Res)
{//If present then return true
for (String str : Res) {if (str.equals(s))
return true ;
}//Not present
return false ;
}//Function to return an ArrayList containg
//all the distinct permutations of the string
static ArrayList<
String>
distinctPermute(String str)
{//If string is empty
if (str.length() == 0 ) {//Return an empty arraylist
ArrayList<
String>
baseRes = new ArrayList<
>
();
baseRes.add( "" );
return baseRes;
}//Take first character of str
char ch = str.charAt( 0 );
//Rest of the string after excluding
//the first character
String restStr = str.substring( 1 );
//Recurvise call
ArrayList<
String>
prevRes = distinctPermute(restStr);
//Store the generated sequence into
//the resultant Arraylist
ArrayList<
String>
Res = new ArrayList<
>
();
for (String s : prevRes) {
for ( int i = 0 ;
i <
= s.length();
i++) {
String f = s.substring( 0 , i) + ch + s.substring(i);
//If the generated string is not
//already present in the Arraylist
if (!isPresent(f, Res))//Add the generated string to the Arraylist
Res.add(f);
}
}//Return the resultant arraylist
return Res;
}//Driver code
public static void main(String[] args)
{
String s = "abbb" ;
System.out.println(distinctPermute(s));
}
}
输出如下:
[abbb, babb, bbab, bbba]
优化:我们可以优化上述解决方案,使用HashSet来存储结果字符串,以取代Res ArrayList。
推荐阅读
- GRE数据分析|数据分布,随机变量和概率分布
- Oracle面试经验|S62(校园服务器技术)
- Java使用正则表达式验证日期格式
- 按字典顺序,给定字符串的所有最短回文子字符串
- 打印数组A[]中的所有字符串,并将数组B[]中的所有字符串作为子序列
- CRASH()宏–用法解释
- 如何创建和访问Python包(详细示例)
- 创建具有O和X的交替矩形的矩阵
- 使用tkinter在Python中创建是/否消息框