下一个按字典顺序排列的字符串更大的排列

时间:2015-10-01 04:37:17

标签: java algorithm

问题是找到字典下一个比给定字符串更大的字符串  例如:输入:DKHC OP:HKDC。

我无法弄清楚我的代码在哪里做错了。有人可以帮我调试。

*

public static void main(String[] main)
    {
        String s = "gojh";
        String op="";
        //System.out.println();
        int i=s.length()-1;
        int j=i-1;
        boolean swapped=false;
        while(i>0)
        {
            j=i-1;
        while(j>=0)
        {   if(s.charAt(i)>s.charAt(j))
            {   System.out.println(s.charAt(j)+" ->"+s.charAt(i));
                s=s.substring(0,j)+s.charAt(i)+s.substring(j+1,i)+s.charAt(j)+s.substring(i+1);
                swapped=true;
                break;
            }
            else 
            {
                j--;
            }
        }
        System.out.println(i);
        if(swapped)
            break;
        else
            i--;

      } 
        //System.out.println(s);
        if((i-j)>=2)
           op= minimize(s,j);
        else
            op=s;
        System.out.println(op);
    }
    private static String minimize(String s,int index) {
        String reverse="";
        String original=s.substring(index+1);
        int i=original.length()-1;
        while(i>=0)
        {
            reverse=reverse+original.charAt(i);
            i--;
        }
        //System.out.println(reverse);

        return s.substring(0,index+1)+reverse;
    }

*

1 个答案:

答案 0 :(得分:0)

您的代码中没有给出I / O示例(代码输入/输出和预期输出),因此调试它太详尽。但是只要看一眼它就会告诉我一些事情:

  1. 您实际上正在使用O(n ^ 2)算法,(n =字符串的长度),而这在一次迭代中很容易解决。

  2. 您的示例和问题描述错误。如果i / p为DKHC,则下一个字典大字符串将为HCDK HKDC

  3. 所以,假设你在那里犯了错误,我会给你一个算法来做正确的事情(根据问题描述)。

    • 从字符串末尾开始。找到charAt(i) < charAt(i+1)的索引。停在那里。 (如果你没有得到这个条件并且到达字符串的开头,给定i / p已经是你可以得到的最大的词汇排列。你可以在那里显示错误信息)
    • 现在重申,并找到j的索引charAt(i) < charAt(j)。您 肯定会找到这样的索引。
    • 在索引ij处交换字符。
    • 现在是最后一个(和重要的)步骤。从索引i+1开始反转整个字符串。