当前位置: 首页 > news >正文

Leetcode——最长不重复子串

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

题:从一个字符串中找到一个连续子串,该子串中任何两个字符不能相同,求子串的最大长度并输出一条最长不重复子串。

自己的第一反应是使用动态规划来解决这个问题。在搜集资料之后,发现共有三种解决方案:

  1. 使用hash

  2. 使用DP + Hash

==================================================================

基本方法,使用简单Hash

其实判断重复问题最应该想到的是Hash,建立一个简单的hash table,key为字符的ASCII码值,value为该字符是否已经在当前子串中出现过(出现过为1,未出现为0)。最简单的方法就是对所有的子串进行查重,复杂度为θ(n^2)。

在扫描过程中,我们需要找到尽可能长的不重复子串,我称之为“极长不重复子串”。假设s[i...j]的当前的极长不重复子串为L(i,j),那么L(i, j+1)的长度分为两种情况:

    1. 上一个s[j+1]代表的字符出现在L(i.j)的起始位置之前,那么s[j+1]应该被添加到当前极长不重复子串中;

    2. 上一个s[j+1]代表的字符出现在L(i,j)的起始位置之后,那么记录下L(i,j),开始跟踪新的极长不重复子串。

在扫描完所有的str[0...n],str[1...n],str[2...n]....后,最长的极长字符串就是字长不重复子串

源代码为:

/* 最长不重复子串 设串不超过30
 * 我们记为 LNRS
 */
int maxlen;
int maxindex;
void output(char * arr);
 
/* LNRS 基本算法 hash */
char visit[256];
 
void LNRS_hash(char * arr, int size)
{
    int i, j;
    for(i = 0; i < size; ++i)
    {
        memset(visit,0,sizeof visit);
        visit[arr[i]] = 1;
        for(j = i+1; j < size; ++j)
        {
            if(visit[arr[j]] == 0)
            {
                visit[arr[j]] = 1;
            }else
            {
                if(j-i > maxlen)
                {
                    maxlen = j - i;
                    maxindex = i;
                }
                break;
            }
        }
        if((j == size) && (j-i > maxlen))
        {
            maxlen = j - i;
            maxindex = i;
        }
    }
    output(arr);
}

=========================================================================

使用DP+hash。使用DP以空间换时间的方法来解决此问题,DP最重要的思想就是要记录。

在第一种方法当中,我们扫面了所有的子串。但是如果str1是str2的子串,那么str1的最长不重复子串肯定小于或者等于str2。我们可以直接扫描整个给定的字符串,并在扫描过程中记录下所有扫描到极大字符串,找到最长的即可(仿照人工的思路)。

使用hash表来保存一个字符最近被扫描的时候所处的位置

代码如下:

class Solution 
{
public:
	int lengthOfLongestSubstring(string s) 
	{
		if (s.empty()) return 0;

		int visit[256];		//用来保存最近扫描到一个字符的位置
		int max_length;		//目前最大不重复子串的长度
		int start_index;	//目前最大不重复子串的起始索引
		int last_start;		//目前扫描的极大不重复子串的起始索引
		int last_length;	//目前扫描的极大不重复子串的长度

		start_index = 0;
		max_length = 0;
		last_start = 0;
		memset(visit, -1, sizeof(int) * 256);

		//第一个字符
		visit[s[0]] = 0;
		last_length = 1;

		for (int i = 1; i < s.size(); i++)
		{
			if (visit[s[i]] == -1)
			{
				last_length++;
				visit[s[i]] = i;
			}
			else if (visit[s[i]] < last_start)
			{
				last_length++;
				visit[s[i]] = i;
			}
			else
			{
				if (last_length > max_length)
				{
					max_length = last_length;
					start_index = last_start;
					last_start = visit[s[i]] + 1;		//更新当前极长子串的起点,是重复字符的后一位
					last_length = i - last_start + 1;
					visit[s[i]] = i;
				}
				else
				{
					last_start = visit[s[i]] + 1;
					last_length = i - last_start + 1;
					visit[s[i]] = i;
				}
			}
		}

		if (last_length > max_length)
		{
			max_length = last_length;
		}
		return max_length;
	}
};


转载于:https://my.oschina.net/u/1047616/blog/494543

相关文章:

  • 修改 SVN 账户密码的方法
  • 一个有趣的算法题。。。
  • Codeforces Gym 100733A Shitália 计算几何
  • configure: error: png.h not found.
  • About SOuP
  • js数组如何去重
  • Scala入门指南与建议
  • Java学习之神奇的i=i++
  • How to setup Wicket Examples in Eclipse
  • spring MVC 跳转到另一个controller方法
  • UVA 1661 Equation (后缀表达式,表达式树,模拟,实现)
  • 转帖-Linux下如何同时替换多个文件中的文本或字符串
  • iOS开发之左右抖动效果
  • 学习笔记: JavaScript/JQuery 的cookie操作
  • google hosts
  • hexo+github搭建个人博客
  • [译]CSS 居中(Center)方法大合集
  • 78. Subsets
  • Github访问慢解决办法
  • HTTP 简介
  • Javascript Math对象和Date对象常用方法详解
  • React系列之 Redux 架构模式
  • Spark学习笔记之相关记录
  • storm drpc实例
  • tensorflow学习笔记3——MNIST应用篇
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • vue的全局变量和全局拦截请求器
  • 搞机器学习要哪些技能
  • 技术胖1-4季视频复习— (看视频笔记)
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • 前端代码风格自动化系列(二)之Commitlint
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 如何解决微信端直接跳WAP端
  • 一文看透浏览器架构
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • ​ssh-keyscan命令--Linux命令应用大词典729个命令解读
  • (windows2012共享文件夹和防火墙设置
  • (超详细)语音信号处理之特征提取
  • (附源码)ssm基于jsp高校选课系统 毕业设计 291627
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (七)MySQL是如何将LRU链表的使用性能优化到极致的?
  • (三)elasticsearch 源码之启动流程分析
  • (五)Python 垃圾回收机制
  • ..thread“main“ com.fasterxml.jackson.databind.JsonMappingException: Jackson version is too old 2.3.1
  • .NET 8.0 中有哪些新的变化?
  • .NET Core 中的路径问题
  • .NET Core引入性能分析引导优化
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • .Net IE10 _doPostBack 未定义
  • .NET国产化改造探索(三)、银河麒麟安装.NET 8环境
  • .Net下的签名与混淆
  • ?php echo ?,?php echo Hello world!;?
  • @Transactional注解下,循环取序列的值,但得到的值都相同的问题
  • @德人合科技——天锐绿盾 | 图纸加密软件有哪些功能呢?
  • [ 环境搭建篇 ] 安装 java 环境并配置环境变量(附 JDK1.8 安装包)