寻找最长无重复子序列

寻找最长不重复子序列:一万+长度

思路:碰到一个元素(a[i])后,往回找,有无重复元素:
若有:假设在第 j 位,则起始端更新为 j + 1,从第 j + 1 再开始找
若前面没有相同的元素,则将第 i 位元素纳入子序列中,即,尾下标 = i,并进行下一轮
详见代码

void longestSubSeq_NoDup(const int* a, int n, int& s, int& e)
{	
	// s = start index of the subsequence
	// e = end index of the subsequence (exclusive)

	s = 0;
	e = n > 0 ? 1 : 0;
	int left=0;//记录起始端
	//左端的元素都没有重复
	for(int i = 0; i < n; i++){
	    int j = i -1;
	    //在第i个元素的左边到left之间找
	    while(j>=left && a[j]!=a[i])j--;
	    if(j<left){
	    //说明[left,i-1]间没有和a[i]相同的元素
	    //可以将当前子串长度与记录的最长字串比对
	        if(i-j>e-s){
	        //某些版本是i-j+1:意思是
	        //若有相同长度的子串,取最后一次出现的起始和终止点
	            s=j;e=i;
	        }
	    }
	    else left=j+1;
	    //left <= j <i,说明a[j]与a[i]相同,且a[j+1]!=a[i]
	    //所以取新的起始端为 j + 1
	}
}
//*copy right goes to Dr. Derek Pao, Department of Electrical Engineering, City University of Hong Kong
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值