package com.String;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
public class StringCode {
/**
* 题目描述:给定两个字符串,将他们组合成为一个新的字符串,要求在新的字符串中保持原字符串中的字符的相对顺序不变,例如 "ab"与"c"合并后可以为"abc""cab""acb"但不许有"bac",
* 即a,b的相对顺序不能变;
* 思路:类似于一个归并问题,分别用0,1来代表两个字符串,遍历合并后字符串的每一位,遇到0则从字串1中顺序取一个字母,遇到1则从字串2中取一个数字,因此只需先获取从0-两字串和 的所有数字的2进制串,
* 在字串 的指导下将两个字串 合并,最后返回结果;
* 尾巴:此解法有其局限性 ,倘若给定两个以上 的字串要求合并,该怎么办?本办法扩展:2-2进制;3-3进制。。。。N-N进制。。
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
StringCode sc=new StringCode();
String str1="ab";
String str2="c";
sc.StrCode(str1, str2);
}
private ArrayList<String> CodeGenerator(String str1,String str2){
int fullength=(str1.length()+str2.length());
long num=1;
for(int i=0;i<fullength;i++){
num*=2;
}
ArrayList<String> retlist=new ArrayList<String>();
for(long i=1;i<num;i++){
String bstr=Long.toBinaryString(i);
StringBuilder sb=new StringBuilder();
for(int j=fullength;j>-1;j--){
if(j>bstr.length()){
sb.append("0");
}else{
sb.append(bstr);break;
}
}
retlist.add(sb.toString());
}
return retlist;
}
public void StrCode(String str1,String str2){
/**
* code generator;
*/
HashSet<String> set=new HashSet<String>();
int fullength=(str1.length()+str2.length());
ArrayList<String> codelist=CodeGenerator(str1,str2);
for(int i=0;i<codelist.size();i++){
String sb=codelist.get(i);
int c1=0;
int c2=0;
char[] rest=new char[fullength];
char[] clist=sb.toString().toCharArray();
for(int k=0;k<clist.length;k++){
char now=clist[k];
if(now=='0'){
if(c1<str1.length()){
rest[k]=str1.charAt(c1);
c1++;
}else{
rest[k]=str2.charAt(c2);
c2++;
}
}else{
if(c2<str2.length()){
rest[k]=str2.charAt(c2);
c2++;
}else{
rest[k]=str1.charAt(c1);
c1++;
}
}
}
String fre=new String(rest);
set.add(fre);
}
Iterator<String> iter=set.iterator();
while(iter.hasNext()){
System.out.println(iter.next());
}
}
}
字串之定向排列
最新推荐文章于 2024-07-02 23:45:45 发布