22.1(最大连续递增的有序子字符串)编写一个Java程序,提示用户输入一个字符串,然后显示最大连续 递增的有序子字符串。分析你的程序的时间复杂度。下面是一个运行示例:
时间: 2024-10-27 14:08:55 浏览: 15
要解决这个问题,我们可以使用双指针技术,同时维护两个指针`start`和`end`。`start`指向当前连续递增序列的开始位置,而`end`用于寻找下一个可能的增加点。程序的主要步骤如下:
1. 初始化`start`和`end`为0,`maxLen`为1,记录最长递增子串的长度,`prevChar`保存前一个字符,初始化为第一个字符。
2. 遍历字符串,对于每个字符:
- 如果当前字符大于等于`prevChar` + 1,说明这是一个新的递增序列的开始,更新`start = end + 1`,并将`prevChar`设为当前字符。
- 否则,尝试将`end`向右移动,找到一个新的递增序列。
- 计算当前位置的子串长度`length = end - start + 1`,如果`length > maxLen`,更新`maxLen`。
3. 最后,打印出从`start`到`start + maxLen - 1`范围内的子串作为最长递增有序子字符串。
下面是简单的Java代码实现:
```java
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一个字符串:");
String input = scanner.nextLine();
char[] chars = input.toCharArray();
int start = 0, end = 0, maxLen = 1;
char prevChar = chars[0];
for (int i = 1; i < chars.length; i++) {
if (chars[i] >= prevChar + 1) {
start = end + 1;
prevChar = chars[i];
} else {
while (i > start && chars[i] > chars[start]) {
start++;
}
end = i;
}
int length = end - start + 1;
if (length > maxLen) {
maxLen = length;
}
}
System.out.printf("最长递增有序子字符串是 %s%n", input.substring(start, start + maxLen));
}
}
```
**时间复杂度分析:**
这个算法的时间复杂度是O(n),其中n是输入字符串的长度。遍历一次字符串,并在每次迭代中最多移动一次`start`和`end`指针,所以总的操作次数与输入长度成线性关系。空间复杂度是O(1),因为我们只用了几个固定的变量存储状态。
阅读全文