a通过移动变成b,我们称a和b为兄弟,现在amry和mary是兄弟,如果我只给出amry,求出他所有的兄弟。给出你的思路和算法。

解决方案 »

  1.   

    将字典所有单词按照字母顺序重新排列,amry和mary都变成amry,兄弟单词同理;再对变化后的单词做hash映射,在对输入的单词做一样的映射
      

  2.   

     public static List<String> getBrothers(String str){
              List<String> brothers = null ;
              if(str != null && str.length()>1)
              brothers = new ArrayList<String>() ;
              for (int i = 0; i < str.length() ; i++) {
              for (int j = i+1; j < str.length() ; j++) {
              brothers.add(str.substring(0, i)+ str.substring(j, j+1)+ str.substring(i+1,j)+ str.substring(i, i+1)+str.substring(j+1))  ;
             //  System.out.println(str.substring(0, i)+":"+ str.substring(j, j+1)+":"+ str.substring(i+1,j)+":"+ str.substring(i, i+1)+":"+str.substring(j+1));
            
          }
    }
              return brothers ;
             }
      

  3.   

    这不是排列组合吗?
    for example
    public class Test {
        public static void main(String[] args) {
            char[] c = "amry".toCharArray();
            parade(c, c.length, new StringBuilder());
        }    public static void parade(char[] c, int n, StringBuilder buf) {
            if (c==null || c.length==0 || n<1) return;
            if (n > c.length) n = c.length;        if (n==1) {
                for (int i=0; i<c.length; i++) {
                    System.out.printf("%s%s\n", buf, c[i]);
                }
                return;
            }        char[] sub = new char[c.length-1];
            for (int i=0; i<c.length; i++) {
                for (int j=0, k=0; j<c.length; j++) {
                    if (i!=j) sub[k++] = c[j];
                }            buf.append(c[i]);
                parade(sub, n-1, buf);
                buf.delete(buf.length()-1, buf.length());
            }
        }
    }
      

  4.   

    package com.demo;import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;public class Demo {

    /**
     * 我的思路是先将输入的字符串变成字符数组,然后将第一个字符和第二个字符交换,
     * 将所得字符数组存进buffer中,重置数组,再将第一个字符与第三个字符交换
     * 依次类推,这样就可以保证计算次数最小。
     * 输入字符为abcd,以下为输出结果
     * Result::bacd cbad dbca acbd adcb abdc 
     * 仅供参考,欢迎讨论
     */
    public static void main(String[] args) throws IOException{
    BufferedReader is = new BufferedReader(new InputStreamReader(System.in));
    String str = is.readLine();
    StringBuffer buffer = new StringBuffer("Result::");
    char[] ch = str.toCharArray();
    int count = 0;
    for(int i = 0; i < ch.length - 1; i++){
    for(int j = i + 1; j < ch.length; j++){
    char temp = ch[i];
    ch[i] = ch[j];
    ch[j] = temp;
    buffer.append(ch).append(" ");
    ch = str.toCharArray();
    count++;
    }
    }

    System.out.println(buffer);
    }

    }
      

  5.   

    神人们,我怎么不了解题意。什么叫a通过移动变成b,amry和mary为兄弟能得出什么?那位兄弟给讲讲?不会又是那个“船长年龄的问题吧(一艘航行海上的轮船上有8箱葡萄酒 12头奶牛 27只羊 问个船长多少岁 )”!这个面试题感觉真狗血!
      

  6.   

    对于str1和str2是否是兄弟,首先先判断长度是否相等,如果不相等那么肯定不是兄弟如果相等,那么看看str1+str1+str1是否包含str2就可以了
      

  7.   

    因此对于任意的长度为N的字符串str
    先构建字符串model=str+str+str
    然后从model的第一个字符开始逐渐取N个字符,直到2N个字符为止,当然为了防止重复你可以放到HashSet集合类中
      

  8.   

    public class h2048 { static void Arrys(){
    String s="marry";
    char[] s1=s.toCharArray();
    int temp=0;
    for(int i=0;i<=s1.length;i++)
    {
    for(int k=0;k<=s1.length;k++)
    {
    for(int l=0;l<=s1.length;l++)
    {
    for(int m=0;m<=s1.length;m++)
    {
    for(int n=0;n<=s1.length;n++)
    {
    if(i+k+m+l+n==0+1+2+3+4)
    {if(i==k||i==m||i==l||i==n||k==m||k==l||k==n||m==l||m==n||l==n)
    {}
    else { System.out.println(s1[i]+""+ s1[k]+""+ s1[l]+""+s1[m]+""+s1[n]);
    temp++;
    }
    }}
    }
    }
    }
    }
    System.out.println("一共的算法数是::"+temp);
    }  
     
        public static void main(String[] args) {
      Arrys();
      
    }}
    marry
    maryr
    marry
    maryr
    mayrr
    mayrr
    mrary
    mrayr
    mrray
    mrrya
    mryar
    mryra
    mrary
    mrayr
    mrray
    mrrya
    mryar
    mryra
    myarr
    myarr
    myrar
    myrra
    myrar
    myrra
    amrry
    amryr
    amrry
    amryr
    amyrr
    amyrr
    armry
    armyr
    arrmy
    arrym
    arymr
    aryrm
    armry
    armyr
    arrmy
    arrym
    arymr
    aryrm
    aymrr
    aymrr
    ayrmr
    ayrrm
    ayrmr
    ayrrm
    rmary
    rmayr
    rmray
    rmrya
    rmyar
    rmyra
    ramry
    ramyr
    rarmy
    rarym
    raymr
    rayrm
    rrmay
    rrmya
    rramy
    rraym
    rryma
    rryam
    rymar
    rymra
    ryamr
    ryarm
    ryrma
    ryram
    rmary
    rmayr
    rmray
    rmrya
    rmyar
    rmyra
    ramry
    ramyr
    rarmy
    rarym
    raymr
    rayrm
    rrmay
    rrmya
    rramy
    rraym
    rryma
    rryam
    rymar
    rymra
    ryamr
    ryarm
    ryrma
    ryram
    ymarr
    ymarr
    ymrar
    ymrra
    ymrar
    ymrra
    yamrr
    yamrr
    yarmr
    yarrm
    yarmr
    yarrm
    yrmar
    yrmra
    yramr
    yrarm
    yrrma
    yrram
    yrmar
    yrmra
    yramr
    yrarm
    yrrma
    yrram
    一共的算法数是::120
    搞错了 算成marry的排序了.....不过原理可以参考一下的......
      

  9.   

    看楼上的代码才发现自己忘了排除含有两个相同字母的单词的情况了.楼主自己在for循环里加一句吧!顺便提醒楼上的,你的输出里貌似有相同的字符串.而且,5个字母排列组合,输出应该是11个,去掉原来的字符串,应该是10个