微软编程一小时题目二

原题如下:

题目2 : Longest Repeated Sequence

时间限制: 10000ms
单点时限: 1000ms
内存限制: 256MB

描述

You are given a sequence of integers, A = a1, a2, ... an. A consecutive subsequence of A (say ai, ai+1 ... aj) is called a "repeated sequence" if it appears more than once in A (there exists some positive k that ai+k = ai, ai+k+1 = ai+1, ... aj+k = aj) and its appearances are not intersected (i + k > j).

Can you find the longest repeated sequence in A?

输入

Line 1: n (1 <= n <= 300), the length of A.
Line 2: the sequence, a1 a2 ... an (0 <= ai <= 100).

输出

The length of the longest repeated sequence.

样例输入
5
2 3 2 3 2
样例输出
2
该题目是寻找最长不相交的重复子串,我目前能想到的还是暴力解法,即从前往后一次扫描,当发现两个起始字符相同的子串且字串长度大于之前的最大子串长度时进行比较,这种方法比较容易理解,但由于比较过程中会不断的返回起点,所以效率不是太高,代码如下:

#define _CRT_SECURE_NO_DEPRECATE
#include"stdafx.h"
#include <stdio.h>
int main(){
    int len,maxLen = 0,curLen,step;
	int value[300];
	scanf("%d",&len);
	for(int i = 0; i < len;i++)
		scanf("%d",&value[i]);
	for(int i = 0 ; i < len; i++){
		for(int j = i + 1; j < len; j++){
			if(value[i] == value[j]  && (j - i) > maxLen ){
				curLen = j - i;
				step = 0;//记录向前走的步长,用于返回
				for(int k = 0; k < curLen; k++){
					if(value[i] != value[j]){
					   break;//当前curlen的重复子串不存在
					}
					i++;
					j++;
					step++;
				}
				if(step == curLen){//当前curLen的重复子串存在
					maxLen = curLen;
				}				
				i = i - step;
				j = j - step;				
			}
		}
		
	}
	printf("%d\n",maxLen);
}
同样,上述代码也没有经过在线测试,有错误还望指正。另外,此题应该有更加高效的算法,还望大牛们不吝赐教!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值