定一个字符串S, 任务是找出需要重新排列的S的最小子串的长度,以使字符串S的所有字符都按词汇表顺序排列。
举例说明。
输入。S = "aabbace" 输出。3
解释。将 "bba "重新排列为 "abb"。
S变成 "aaabbce",这是按词法顺序排列的。输入。S = "abez" 输出。0
办法。按照步骤来解决这个问题。
- 将0到N-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)