package test;import java.util.ArrayList; import java.util.Iterator; import java.util.List;public class CharZuhe {
public static List getChar(String str){ if(str.length()>1){ String s1=str.substring(0,1); String s2=str.substring(1,str.length()); System.out.println("s1:"+s1); System.out.println("s2:"+s2); List l=getChar(s2); System.out.println("up:l:"+l); List r=new ArrayList();
CL1(排列组合)
CL2(其中L是长度)
或者Pll
如aba
排列组合计算!
看数学了!呵呵
http://my.6cncn.cn
int strlen=str.length;
for(int i=0;i<strlen;i++){
for(int j=0;j<strlen;j++){ }
}
结果是对.但需要改进
你自己改吧!
String str = "abcde";
int length = str.length();
for(int i=0;i<length;i++){
System.out.println(str.substring(i, i + 1));
}
for (int j = 0; j < length ; j++) {// 首字母
for (int i = 1; i < length - 1; i++) {// 字符串个数
for (int k = j; k < length - i; k++) {//
System.out.println(str.substring(j, j + 1)
+ str.substring(k + 1, k + i + 1));
}
}
}
System.out.println(str);
private static void process(char[] c,int[] p,Set a){
String temp=""+c[0];
for (int i=0;i<p.length;i++){
if (p[i]==0){
temp+=c[i+1];
}else{
a.add(temp);
temp=""+c[i+1];
}
}
a.add(temp);
}
private static boolean isLast(int[] operator){
for (int i=operator.length-1;i>=0;i--){
operator[i]++;
if (operator[i]>=2){
operator[i]=0;
}else{
return false;
}
} return true;
}
public static ArrayList getChar(String str) {
Set s=new TreeSet();
char[] c=str.toCharArray();
int[] p=new int[c.length-1];
do {
process(c,p,s);
}while(!isLast(p));
ArrayList a=new ArrayList(s);
return a;
} public static void main(String[] args) {
System.out.println(getChar("abcd"));
}
}
等下有空再来
{
public static void main(String[] args)
{
String str = "abcd";
Vector temp;
cal cc = new cal(str);
temp = cc.Cal(); for(int i= 0; i < temp.size(); i++)
{
System.out.println((String)temp.elementAt(i));
}
}
}
class cal
{
String tempStr; public cal(String _s)
{
tempStr = _s;
} public Vector Cal()
{
Vector v = new Vector();
Vector v1= new Vector() ;
v.addElement(tempStr); String[] str = {}; int count = 0;;
String temp = tempStr;
String oldstr= "";
char[] a = new char[1];
String lastStr = "" ;
int i = 0; while( i != temp.length())
{
a[0] = temp.charAt(i); for(int j= 0; j< temp.length();j++)
{
if(a[0] == temp.charAt(j))
{
oldstr = new String(a); while(temp.indexOf(oldstr) >= 0)
{ if(oldstr.equals(temp.substring(0,1)))
{ lastStr = temp.substring(temp.indexOf(oldstr)+1);
}
else
{
lastStr = temp.substring(0, temp.indexOf(oldstr))
+ temp.substring(temp.indexOf(oldstr) +1); } break;
// }
}
} v1.removeAllElements();
v1.addElement(lastStr);
//
String hh = " "; hh = oldstr; for(int k = 0; k < lastStr.length();k++)
{ v.addElement((String)(hh+lastStr.substring(k)));
count++; } // i++;
}
return v;
}
}
private static void getSub(ArrayList list,String str){
String substr1=str.substring(0,1);
String substr2=str.substring(1,str.length());
if (substr2.length()>=1){
getSub(list,substr2);
}
int len=list.size();
for (int i=0;i<len;i++){
list.add(substr1+(String)list.get(i));
}
list.add(substr1);
}
public static ArrayList getChar(String str){
ArrayList data=new ArrayList();
getSub(data,str);
return data;
} public static void main(String[] args) {
ArrayList l=getChar("abcd");
Collections.sort(l,new Comparator(){
public int compare(Object o1, Object o2){
String s1=(String)o1;
String s2=(String)o2;
return s1.length()-s2.length()!=0?(s1.length()-s2.length()):s1.compareTo(s2);
}
});
System.out.println(l);
}
}
1.如果字母重复了怎么处理?比如"abca",怎么算.
2.算出一个字符串的组合形式,比如字符串是"cba",那组合应该是c,b,a,cb,ca,ba,cba还是a,b,c,ab,ac,bc,abc??
import java.util.ArrayList;public class Test2 { /**
* @param args
*/
public static void main(String[] args) {
Test2 te = new Test2();
ArrayList list = te.getChar("abcd");
for(int i=0; i<list.size(); i++) {
System.out.println(list.get(i));
}
}
public ArrayList getChar(String str){
ArrayList<String> nums = new ArrayList<String>();
for(int i=0; i<str.length(); i++) {
int k = nums.size();
for(int j=0; j<k; j++) {
String ss = nums.get(j) + str.substring(i, i+1);
nums.add(ss);
}
nums.add(str.substring(i,i+1));
}
return nums;
}}
第二,相比来说,很明显,在要求有顺序的时候,这道题比较简单,只需要从头开始取数字即可
所以可以用上面usxue(尘飞扬)的程序,不过要改一下
return new ArrayList((new HashSet(nums)));
目的是在最后return之前去除重复记录,否则输入字符串为“aa”的时候就错了。
如果没有顺序要求,即可出现“ac”和“ca”,则用递归程序,
public ArrayList getChar(String str) {
ArrayList list = new ArrayList();
if (str.length() == 1) {
list.add(str);
} else {
for (int i = str.length() - 1; i >= 0; i--) {
String lastChar = str.substring(i, i + 1);
ArrayList subList = getChar((new StringBuffer(str).deleteCharAt(i)).toString());
for (Iterator iter = subList.iterator(); iter.hasNext();) {
String element = (String) iter.next();
list.add(element);
element = element + lastChar;
list.add(element);
}
}
}
return new ArrayList((new HashSet(list)));
}递归效率还是非常低的,尤其是在非顺序条件下,8个不同字符就会有109600种结果,当9个不同字符时,我这里就已经OutOfMemoryError了。
递归的效率跟普通函数调用一样,不存在“非常低”的说法!按楼主题目的意思,很明显是有顺序的。
谢谢提醒!我错了。
递归只是内存开销比循环的方法大。
import java.util.Iterator;
import java.util.List;public class CharZuhe {
public static List getChar(String str){
if(str.length()>1){
String s1=str.substring(0,1);
String s2=str.substring(1,str.length());
System.out.println("s1:"+s1);
System.out.println("s2:"+s2);
List l=getChar(s2);
System.out.println("up:l:"+l);
List r=new ArrayList();
Iterator it=l.iterator();
while(it.hasNext()){
String sl=(String)it.next();
String temp=null;
if(sl!=null){
temp=s1+sl;
}else{
temp=s1;
}
r.add(sl);
r.add(temp);
}
System.out.println("r:"+r);
return r;
}else{
List l=new ArrayList();
l.add(str);
l.add(null);
System.out.println("down:l:"+l);
return l;
}
//ArrayList l=getChar(s2);
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("result:"+CharZuhe.getChar("abcd"));
}}
ArrayList list = new ArrayList();
int length = str.length();
char tmpChar;
for(int i = 0; i <= length - 1; i++){
tmpChar = str.charAt(i);
list.add(tmpChar + "");
int tmpInt = i + 1;
while(tmpInt < length){
for(int j = tmpInt + 1; j <= length; j++){
list.add(tmpChar + str.substring(tmpInt,j));
}
tmpInt++;
}
}
return list;
}//写的匆忙,用的循环不太好