黑马程序员技术交流社区
标题:
这题不会做啊!求大神帮忙解决。
[打印本页]
作者:
汗血黑马
时间:
2014-3-4 15:19
标题:
这题不会做啊!求大神帮忙解决。
编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符
例如:
原始字符串是"abc",打印得到下列所有组合情况
"a" "b" "c"
"ab" "bc" "ca" "ba" "cb" "ac"
"abc" "acb" "bac" "bca" "cab" "cba"。:dizzy:多一点代码注释,本人好分析理解,非常感谢!
作者:
chaos
时间:
2014-3-4 16:18
public class Test{
public static void main(String[] args) {
String s ="abc";
char[] arr = s.toCharArray();
new Test().Sort(arr);
}
//排列
public static void Sort(char[] arr)
{
//输出第一行
for(int i = 0;i<arr.length;i++)
{
System.out.print("\""+arr[i]+"\"");
}
System.out.println();
//输出第二行
for(int i = 0;i<arr.length;i++)
{
for(int j = 0;j<arr.length;j++)
{
if(arr[i]!=arr[j])
System.out.print("\""+arr[i]+arr[j]+"\"");
}
}
System.out.println();
//输出第三行
for(int i = 0;i<arr.length;i++)
{
for(int j = 0;j<arr.length;j++)
{
for(int k = 0;k<arr.length;k++)
if(arr[i]!=arr[j]&&arr[i]!=arr[k]&&arr[j]!=arr[k])
System.out.print("\""+arr[i]+arr[j]+arr[k]+"\"");
}
}
System.out.println();
}
}
作者:
薛旻
时间:
2014-3-4 16:41
我的这个代码有点局限性不能拓展,只能是三个字符,要各种字符的话,估计要用到递归,我完了再试试
public class StringDemo {
public static void main(String[] args) {
String string = "abc";
char[] charArray = string.toCharArray();
for (int i = 0; i < charArray.length; i++) {
//一个字符
System.out.println(charArray[i]);
//两个字符
for (int j = 0; j < charArray.length; j++) {
if(charArray[j] != charArray[i]) {
System.out.println(charArray[i] + "" +charArray[j] + "");
//三个字符
for (int k = 0; k < charArray.length; k++) {
if(charArray[k] != charArray[j] && charArray[k] != charArray[i])
System.out.println(charArray[i] + "" + charArray[j] + "" + charArray[k] + "");
}
}
}
}
}
}
复制代码
作者:
Amorvos
时间:
2014-3-4 16:57
楼上,我觉得你这种方法空间复杂度过高,如果26个字母全部出现的话空间将占用极大,你不觉得这样会内存溢出吗?而且不一定就只有3位呀,你这个char数组不能确定开几维呀,只能按最大开,那就要建立一个26x26的char数组。这样不大合适吧,我觉得还是全排列好一点。楼主看看有什么启发
PS: 全排列代码
public class AllSort {
public static void main(String[] args) {
char buf[] = { 'a', 'b', 'c' };
perm(buf, 0, buf.length - 1);
}
public static void perm(char[] buf, int start, int end) {
if (start == end) {
for (int i = 0; i <= end; i++) {
System.out.print(buf[i]);
}
System.out.print(" ");
} else {
for (int i = start; i <= end; i++) {// (让指针start分别指向每一个数)
char temp = buf[start];// 交换数组第一个元素与后续的元素
buf[start] = buf[i];
buf[i] = temp;
perm(buf, start + 1, end);// 后续元素递归全排列
temp = buf[start];// 将交换后的数组还原
buf[start] = buf[i];
buf[i] = temp;
}
}
}
}
复制代码
作者:
syw02014
时间:
2014-3-4 17:40
希望能帮到你:
import java.util.Scanner;
public class PaiLie
{
private int len;
private char[] getRest(char[] arr,int i)
{
char[] rs=new char[arr.length-1];
for(int j=0;j<i;j++)
rs[j]=arr[j];
for(int j=i+1;j<arr.length;j++)
rs[j-1]=arr[j];
return rs;
}
public void getResult_All(String content)
{
char[] arr=content.toCharArray();
len=arr.length;
PL_All("",arr,len);
}
private void swap(char[] arr,int i,int j)
{
if(i==j)
return;
char tmp=arr[i];
arr[i]=arr[j];
arr[j]=tmp;
}
private void PL_All(String pre,char[] arr,int length)
{
if(length<1)
return;
for(int i=0;i<length;i++)
{
char first=arr[i];
swap(arr, i, length-1);
PL_All(pre+first,arr,length-1);
swap(arr, length-1,i);
}
}
public static void main(String[] args)
{
Scanner scanner=new Scanner(System.in);
System.out.println("please input:");
String content=scanner.nextLine();
PaiLie PL=new
PaiLie ();
PL.getResult_All(content);
}
}
复制代码
作者:
薛旻
时间:
2014-3-4 18:04
薛旻 发表于 2014-3-4 16:41
我的这个代码有点局限性不能拓展,只能是三个字符,要各种字符的话,估计要用到递归,我完了再试试
...
嘿嘿,为了简单,循环嵌在一起了,抱歉抱歉,意思还是可以理解的
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2