字串之定向排列

本文介绍了一种特殊的字符串合并算法,该算法能确保合并后的字符串中原始字符串的字符顺序不变。通过生成二进制序列指导字符串的合并过程,并最终输出所有可能的合并结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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());

      }

   }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值