簡體   English   中英

下一個按字典順序排列的字符串的更大排列

[英]Next lexicographically bigger permutation of a string

問題是查找詞典詞典中比給定字符串更大的下一個字符串,例如:輸入: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;
    }

*

您的代碼中沒有給出I / O示例(代碼的輸入/輸出和預期的輸出),因此調試它太詳盡了。 但一看便知:

  1. 您實際上是在使用O(n ^ 2)算法(n =字符串的長度),而在一次迭代中很容易解決。

  2. 您的示例和問題描述是錯誤的。 如果I / P是DKHC ,未來辭書更大的字符串將是HCDK ,而不是 HKDC

因此,假設您在此處犯了一個錯誤,我會給您一個算法來做正確的事(根據問題描述)。

  • 從字符串的結尾開始到開頭。 找到charAt(i) < charAt(i+1)的索引。 停在那 (如果您沒有達到這種條件,直到字符串開始,就可以了,因為i / p已經是您可以獲得的最大詞匯排列。您可以在此處顯示錯誤消息)
  • 現在從頭開始重申,並找到一個索引j ,使得charAt(i) < charAt(j) 一定會找到這樣的索引。
  • 在索引ij處交換字符。
  • 現在是最后(也是重要的)步驟。 從索引i+1開始反轉整個字符串。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM