java|寻找最小的子串进行重新排列以使字符串按词汇表排序

32 阅读1分钟

定一个字符串S, 任务是找出需要重新排列的S的最小子串的长度,以使字符串S的所有字符都按词汇表顺序排列。

举例说明。

输入。S = "aabbace" 输出。3
解释。将 "bba "重新排列为 "abb"。
S变成 "aaabbce",这是按词法顺序排列的。

输入。S = "abez" 输出。0

办法。按照步骤来解决这个问题。

  • 0N-2的每个字符**S[i]**与它后面的所有字符比较。
  • 一旦我们找到一个比前一个字符小的lexicographically的字符。
    • 如果最后一个字符的索引位置是最大的,我们就把它的索引储存在end中,如果它的索引位置是最大的,就把它的索引储存在start中。
    • 如果前一个字符的索引位置是最小的,则将其存储在start中。
    • 同时更新ans,这是我们需要修改的字符串长度。
  • 在end和start的差值上加1,因为它是0索引的。
  • 如果字符串已经按照lexicographical顺序排列,则返回0。

下面是上述方法的实现。

java

// JAVA code for the above approach:
import java.util.*;
class GFG {
    static int smallestsubstring(String s)
    {
        int n = s.length(), ans = 0,
            start = Integer.MAX_VALUE,
            end = Integer.MIN_VALUE;
        for (int i = 0; i < n - 1; i++) {
            for (int j = i + 1; j < n; j++)
                if ((int)s.charAt(j) < (int)s.charAt(i)) {
                    start = Math.min(start, i);
                    end = Math.max(end, j);
                    ans = end - start + 1;
                }
        }
        return ans;
    }
 
    // Drivers code
    public static void main(String[] args)
    {
        String s = "aabbace";
 
        // Function Call
        System.out.println(smallestsubstring(s));
    }
}
 
// This code is contributed by Taranpreet

输出

3

时间复杂度。 O(N2)
辅助空间。 O(1)