首页 > 其他分享 >无重复字符的最长子串的长度

无重复字符的最长子串的长度

时间:2023-04-04 11:01:10浏览次数:37  
标签:子串 字符 int 重复 ans 最长 rk

题目链接

解题思路

假设有个字符串"abcabca"
首先读懂题目,字符指的是个单个字母'a' 'b'这种, 子串指的是"ab" "abc" "abca", "ac"不是子串,所以要求是连续的。无重复字符的意思就是指"abc"中没有一样的字符,而"abca"有两个'a'就重复了。
最直接的思路是使用滑动窗口,用窗口右边的指针记录窗口的位置,每次循环检测有重复的就移除左边的字符窜,添加右边的字符串,没有重复的就继续添加右边的字符串,这样循环字符串长度的次数,取出最长的结果

代码

func lengthOfLongestSubstring(s string) int {
 // 记录下标的hash表,也就是说的滑动窗口
 m := map[byte]int{}
 // 字符串的长度
 n := len(s)
 // 窗口的右指针和每次循环的结果
 rk, ans := -1, 0
 // 一共循环len(s)次,左指针的位置,初始值隐性地表示为 -1
 for i := 0; i < n; i++ {
  if i != 0 {
    // 左指针向右移动一格
    delete(m, s[i-1])
  }
  // m[s[rk+1]] == 0 判断这些字符是否出现过
  // go的整型数字默认值是0
  for rk+1 < n && m[s[rk+1]] == 0 {
    // 取ascii码做key
    m[s[rk+1]]++
    // 不断地移动右指针
    rk++
  }
  // 第 i 到 rk 个字符是一个极长的无重复字符子串
  // rk - i + 1算出来当前子串的长度
  // 从len(s)个结果中选出最长的
  ans = max(ans, rk-i+1)
 }
 return ans
}

func max(x, y int) int {
  if x < y {
    return y
  }
  return x
}

结果测试

func main() {
  var s1 = "bbbbb"
  var s2 = "abcabca"
  strLen1 := lengthOfLongestSubstring(s1)
  fmt.Println(strLen1) // 1
  strLen2 := lengthOfLongestSubstring(s2)
  fmt.Println(strLen2) // 3
}

标签:子串,字符,int,重复,ans,最长,rk
From: https://www.cnblogs.com/yetianyun/p/17254685.html

相关文章

  • JS 字符串补0
    padStart用另一个字符串填充当前字符串(如果需要的话,会重复多次),以便产生的字符串达到给定的长度。从当前字符串的左侧开始填充。语法padStart(targetLength)padStart(targetLength,padString)参数targetLength当前字符串需要填充到的目标长度。如果这个数值小于当前字......
  • 华为OD机试 最长的元音字符串
    本期题目:最长的元音字符串题目定义当一个字符串只有元音字母(a,e,i,o,u,A,E,I,O,U)组成,称为元音字符串,现给定一个字符串,请找出其中最长的元音字符串,并返回其长度,如果找不到请返回0,字符串中任意一个连续字符组成的子序列称为该字符串的子串输入一个字符串其长度 0<lengt......
  • 最长连续序列(并查集、数组)、复原 IP 地址(字符串、回溯)、删除链表的倒数第 N 个结
    最长连续序列(并查集、数组)给定一个未排序的整数数组nums,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。请你设计并实现时间复杂度为O(n)__的算法解决此问题。示例1:输入:nums=[100,4,200,1,3,2]输出:4解释:最长数字连续序列是[1,2,3,4]。它的长度为4......
  • 最小覆盖子串(哈希表、字符串)、两数之和(数组、哈希表)、二叉树的层序遍历 II(树、广
    最小覆盖子串(哈希表、字符串)给你一个字符串s、一个字符串t。返回s中涵盖t所有字符的最小子串。如果s中不存在涵盖t所有字符的子串,则返回空字符串""。**注意:**如果s中存在这样的子串,我们保证它是唯一的答案。示例1:输入:s="ADOBECODEBANC",t="ABC"输出:"B......
  • Python字符串模糊匹配
    四种模糊匹配方法1、ratio()——使用纯LevenshteinDistance进行匹配。2、partial_ratio()——基于最佳的子串(substrings)进行匹配3、token_set_ratio——对字符串进行标记(tokenizes)并在匹配之前按字母顺序对它们进行排序 4、token_set_ratio——对字符串进行标记(tokenizes)并......
  • 字符串和数组类型详解
    一.字符串1.正常的字符串我们使用单引号,或者双引号包裹2.注意转义字符\\'转义打印一个单引号\n换行\t表格打印\u4e2d\u####Unicode字符\x41Ascll字符3.多行字符串的编写``,这个符号在tab键上面,英文键盘varmsg=`......
  • (4.3)数组、对象及类数组对象,set的用法,正则表达式的常用方法,蓝桥杯备赛-(生成数组、数
    1.1数组、对象及类数组对象1.数组:​ 数组是有序的数据集合,其中的索引值从0开始递增,并且数组有length属性,可以获取数组内的元素个数,其中的值可以是任何的数组类型。2.对象:​ 对象是无序的是由一个或多个键值对组成的数据集合,对象没有length属性。3.伪数组(类数组对象):​ ......
  • C#如何更新配置文件中的连接字符串
    以MySql为例,其它数据库使用方法一样说明:正常情况下,如果数据库在本机,尽量使用Windows身份验证,如果不在本机,连接字符串里的密码也是需要加密存储,本文只做演示,所以直接使用明文密码。如下在App.config中添加了两条如下连接字符串   第一条是使用ADO.Net使用的连接字符串,第......
  • Freemarker操作字符串
     [b]1、substring[/b](start,end)从一个字符串中截取子串start:截取子串开始的索引,start必须大于等于0,小于等于endend:截取子串的长度,end必须大于等于0,小于等于字符串长度,如果省略该参数,默认为字符串长度。例子:${‘str’?substring(0)}à结果为str${‘str’?substring(1)}à结......
  • [计蒜客][字符串]字符串A的数量
    算法标签字符串来源计蒜客2020蓝桥杯习题题目简介思路AC代码#include<iostream>#include<cstring>usingnamespacestd;intmain(){strings;cin>>s; intcnt=0;for(autoop:s)if(op=='A')cnt++;cout<<cnt;return0;}......