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

电子商务网站开发的基本流程镇江网站设计开发公司电话

电子商务网站开发的基本流程,镇江网站设计开发公司电话,中国品牌装修公司排名,如何创建自己的网站平台今天处理一道算法题目,《剑指Offer》第48题,力扣中等题。 这道题也是面试的高频题! 题目描述 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。 示例1: 输入: "abcabcbb" …

今天处理一道算法题目,《剑指Offer》第48题,力扣中等题。

这道题也是面试的高频题!

题目描述

请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。

示例1:

输入: "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

示例 2:

输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

示例 3:

输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

解题思路

方法1:动态规划

用f(i)表示以第i个字符为结尾的不含重复字符的最长长度,推断出三种情况:

1. 如果当前字符在之前都没出现过,那么f(i) = f(i-1) + 1;

2. 如果当前字符在之前出现过,并且两者的距离差d<=f(i-1),那么当前的最长长度即为d;

3. 如果当前字符在之前出现过,并且两者的距离差d>f(i-1),那么说明之前的这个元素已经在滑动窗口之外,我们仍然可以用f(i) = f(i-1)+1;

/*** 动态规划*设f(i)表示以第i个字符为结尾的不含重复字符的最长长度,可以得到状态转换方程:f(i)={f(i-1)+1; 第i个字符之前没出现过d; 之前出现过,但和之前出现的字符距离差d小于等于f(i-1),即d<f(i-1)f(i-1)+1; 之前出现过,且d>f(i-1)}// 以arabcacfr为例,在计算最后一个r,即f(8)的时候,出现d>f(7)的情况,可以把r追加到f(7)的后面这个思路是最通俗易懂的,但代码和时间上不是最优的* @param s* @return*/public int lengthOfLongestSubstring(String s) {if(s == null || s.length() == 0)return 0;int n = s.length();if(n == 1)return 1;int[] mem = new int[n];Map<Character, Integer> map = new HashMap<>();//初始化mem[0] = 1;map.put(s.charAt(0), 0);for(int i = 1; i < n; ++i) {char c = s.charAt(i);//之前没有出现过,则f(i) = f(i-1)+1if(!map.containsKey(c)) {map.put(c, i);mem[i] = mem[i-1] + 1;}else{//之前出现过,记录差值d,并比较差值和f(i-1)的大小int before = map.get(c);int d = i - before;if(d <= mem[i-1]) {mem[i] = d;}else {mem[i] = mem[i-1]+1;}//最后记得更新这个值map.put(c, i);}}int maxLen = 0;for(int i = 0; i < n; ++i) {maxLen = Math.max(maxLen, mem[i]);}return maxLen;}

总体来说,这种方法时间不是最优,但思路很清晰。

方法2:滑动窗口

用i,j两个指针来控制窗口的左右边界,然后用i每次递增一隔,计算以i为起点的最长无重复子串,只是这里的j不用从i的位置开始,这种做法也是力扣官方的做法,个人觉得不太好,时间复杂度不高。

/*** 滑动窗口(或者就左右指针)* @param s* @return*/public int lengthOfLongestSubstring2(String s) {//abcabcbbif(s == null || s.length() == 0)return 0;int n = s.length();if(n == 1)return 1;Set<Character> set = new HashSet<>();int i = 0;set.add(s.charAt(0));int j = 1;int maxLen = 0;while(i < n) {while(j < n) {char c = s.charAt(j);if(set.contains(c)){break;}set.add(c);j++;}maxLen = Math.max(maxLen, j-i);set.remove(s.charAt(i));i++;}return maxLen;}

方法3:左右指针

该方法是极力推荐的做法:用j遍历字符串,每次判断以j为结尾的最长无重复字符的子串长度,如果出现了重复字符,则更新左边界。只是这里,需要额外注意,更新左边界的时候,需要取上一个左边界和当前元素对应的之前值的最大值。

/*** 左右指针,j表示以第j个字符为结尾的不含重复字符的最长子串* 这里必须要注意一种情况,就是左边界需要取原左边界和当前元素在map中保存的值的最大值* 防止类似于abba这种字符串* @param s* @return*/public int lengthOfLongestSubstring3(String s) {if (s == null || s.length() == 0)return 0;int n = s.length();int i = -1;int maxLen = 0;Map<Character, Integer> map = new HashMap<>();for (int j = 0; j < n; ++j) {if (map.containsKey(s.charAt(j))) {i = Math.max(i, map.get(s.charAt(j)));}map.put(s.charAt(j), j);maxLen = Math.max(maxLen, j - i);}return maxLen;}

http://www.yayakq.cn/news/967277/

相关文章:

  • 制作网站最新工具小韩网站源码
  • 网站建设项目的摘要长沙做网站的价格
  • 网站开发工作流程网站伪静态设置
  • 怎么做网站寄生虫网站开发工作程序怎么写
  • 个人网站建设的目的中国世界排名第几?
  • 南宁网络推广方案佛山seo按效果付费
  • 麻章手机网站建设百度推广网站怎么做
  • 烟台做网站排名江西省网站建设先进表彰
  • 中国建设银行网站对公账户首页app项目策划书
  • 瀚钦科技网站建设深圳建筑设计找工作哪个招聘网站
  • 网站黑名单查询东莞公司企业设计网站建设
  • 专业网站设计网络服务漳州手机网站建设公司
  • 北京响应式网站开发网站购买广告位
  • 昊杰南宫网站建设软件制作专业
  • 3d设计网站东莞整合网站建设营销
  • 网站被墙什么意思中国外协加工网最新加工订单
  • 做网站涉及到哪些网站建设怎么上传不了图片
  • 想自己做个网站在哪里做莱芜杂谈
  • 网站怎么做能快速有排名网页一键生成小程序
  • 揭阳公司做网站十大搜索引擎排行榜
  • php 网站开发框架做异性的视频网站有哪些
  • 购物网站的前台功能网站开发职位
  • 网站建设公司哪家比较好想做个网站怎么做
  • 保定网站优化排名电脑做视频的网站
  • 做门户网站私活多少钱项目管理证书 pmp
  • 做平面设计一般上哪个网站参考太原seo外包服务
  • 深圳网站建设自己人建网站卖广告
  • 徐州网站建设找哪家百科网站模板
  • 平面设计教程网站功能型网站制作多少钱
  • 厦门本地企业网站建设网站建设7个基本流程图