1.最长连续序列。比如 abccccfa,最长连续序列为cccc,长度为4
思路:另开一个数组记录到目前位置最长连续序列长度。每个位置的字符(除第一个)和前一个比较,相同+1,不同标为1
图示:
代码:
#include <stdio.h> #include <string.h> int main() { char s[10] = "abccccfa"; int num[10] = {0}; char tmp; int maxpos, maxval, i; num [0] = 1; maxpos = 0; tmp = s[0]; for(i = 1; i <strlen(s); i++) { if (s[i] == tmp) num[i] = num[i-1] + 1; else num[i] = 1; if(num[i] > num[maxpos]) maxpos = i; tmp = s[i]; } printf("maxlen:%d***maxchar:%c\n", num[maxpos], s[maxpos]); return 0; }
结果:
分析: 空间复杂度:O(n) 时间复杂度:O(n)
同思路问题:
(1)求一字母序列的最长连续上升序列的长度(比如abcffgmnE,abc长为3)
思路:构造一同样大小的数组来记录到目前为止的最长连续序列的长度。在确定该位置的长度是,和前一个比较,如果ascii吗相减为1,那么在上一个长度的基础上+1;否则直接赋值1。
(2)求数字序列的最长连续上升序列的和(比如34123480,1234和为10)
思路:构造一同样大小的数组来记录到目前为止的最长连续序列的和。在确定该位置的和是,和前一个比较,如果相差1,那么在上一个和的基础上+该位置原数组的值;否则直接复制该位置原数组的值。
(3)数列中最大连续元素之和(比如:3 -2 5 1 -10,最大元素之和为7(3 -2 5 1))
int MaxSubSum(int *arr,int n) { int tmp = 0; int MAX = arr[0]; for(int i = 0 ; i < n ; i++) { tmp += arr[i]; if(tmp < 0) { tmp = 0; } if(MAX < tmp) { MAX = tmp; } } return MAX;