算法题---找出给定的字母字符串中连续递增的最长子串

算法题目:给定任意一个非空的全是字母的字符串,找出其中按字典排序的,连续的子串。

情况举例:

  1. 相同字母也算,例如zdfffsse,最长就是dfffss
  2. dfsdfsmmxx,最长就是dfs,相同长度的子串,就取从左到右看,第一次出现的。

算法思路:用一个for循环从左到右遍历,用count记录有序子串的长度,用max记录最大长度。每次遍历完一个有序子串都和max比较,若大于max,则更新max(小于等于都不管)。更新max的时候用start记录该子串的起始位置,便于输出。


Java实现,其余语言同理

//String input = "abcbcdffgggf";
String input = "bmv";
int max = 0;
int count = 1;
int start = 0;
		
for(int i=1; i<input.length(); i++){
    char pre = input.charAt(i-1);
    char now = input.charAt(i);
    if(now-pre>=0){ 
        count++;
    }else{
        if(max<count){
	    max = count;
	    start = i-count;
	}
	count = 1;
    }
}
//这里还需要比较一次,因为如果从某个字符到最后一个都是增序,会导致不会进入else更新max
max = max>count?max:count;
//System.out.println(start+" " + max);
//输出
for(int i=start; i<start+max; i++){
    System.out.print(input.charAt(i));
}

以下是基于滑动窗口的算法实现,对于给定的数字字符串,我们可以从左到右依次取出长度为n的子串,然后判断该子串是否递增(不减、递减、不增),如果是,则将该子串添加到对应的列表。最后,统计每个列表出现次数最多的子串,并返回结果。 ```c #include <stdio.h> #include <string.h> #define MAX_LEN 100000 int main() { char str[MAX_LEN]; int len, n, i, j, k, inc_count, dec_count, eq_count, max_count, max_n; int inc[MAX_LEN], dec[MAX_LEN], eq[MAX_LEN]; printf("请输入数字字符串:"); scanf("%s", str); len = strlen(str); printf("请输入n的值:"); scanf("%d", &n); // 对于长度不足n的字符串直接返回 if (len < n) { printf("字符串长度小于n,无法计算\n"); return 0; } // 初始化计数器 max_count = -1; max_n = -1; // 滑动窗口取子串 for (i = 0; i <= len - n; i++) { inc_count = 1; dec_count = 1; eq_count = 1; // 判断该子串是否递增、递减或不变 for (j = i + 1; j < i + n; j++) { if (str[j] > str[j - 1]) { inc_count++; } else if (str[j] < str[j - 1]) { dec_count++; } else { eq_count++; } } // 将符合条件的子串添加到对应的列表 if (inc_count == n) { inc[k++] = i; } else if (dec_count == n) { dec[k++] = i; } else if (eq_count == n) { eq[k++] = i; } } // 统计每个列表出现次数最多的子串 for (i = 0; i < k; i++) { int count = 1; for (j = i + 1; j < k; j++) { if (inc[i] == inc[j] || dec[i] == dec[j] || eq[i] == eq[j]) { count++; } } if (count > max_count) { max_count = count; if (inc[i] != -1) { max_n = inc[i]; } else if (dec[i] != -1) { max_n = dec[i]; } else if (eq[i] != -1) { max_n = eq[i]; } } } // 输出结果 if (max_count == -1) { printf("不存在长度为%d的递增、递减或不变的子串\n", n); } else { printf("长度最长递增、递减或不变的子串为:"); for (i = max_n; i < max_n + n; i++) { printf("%c", str[i]); } printf("\n"); printf("该子串在整个n-片断串出现的次数为:%d\n", max_count); } return 0; } ``` 注意,本算法假设输入的数字字符串仅由合法数字字符组成,如果输入的字符串包含非法字符,程序可能会出现错误。此外,本算法还假设n的取值在1到10之间,如果n的取值超出这个范围,程序也可能会出现错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值