题解 | 查找无重复最长子串

查找无重复最长子串

https://www.nowcoder.com/practice/59b4ff4167e245c199922880c2733488

解题思路

这是一个经典的滑动窗口问题,需要:

  1. 滑动窗口策略

    • 使用两个指针()维护一个窗口
    • 右指针不断向右扩展,直到遇到重复字符
    • 左指针向右移动,直到删除重复字符
  2. 字符记录

    • 使用数组或哈希表记录每个字符最后出现的位置
    • 当遇到重复字符时,更新左指针位置
  3. 最大长度更新

    • 在窗口移动过程中,持续更新最大长度
    • 最大长度 = max(当前最大长度, )

代码

#include <iostream>
#include <string>
#include <vector>
using namespace std;

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        vector<int> last(128, -1);  // 记录字符最后出现的位置
        int maxLen = 0;
        int left = 0;
        
        for (int right = 0; right < s.length(); right++) {
            // 如果字符已经在窗口中出现过,更新左边界
            if (last[s[right]] >= left) {
                left = last[s[right]] + 1;
            }
            // 更新字符最后出现的位置
            last[s[right]] = right;
            // 更新最大长度
            maxLen = max(maxLen, right - left + 1);
        }
        
        return maxLen;
    }
};

int main() {
    string s;
    cin >> s;
    
    Solution solution;
    cout << solution.lengthOfLongestSubstring(s) << endl;
    
    return 0;
}
import java.util.*;

public class Main {
    static class Solution {
        public int lengthOfLongestSubstring(String s) {
            int[] last = new int[128];  // 记录字符最后出现的位置
            Arrays.fill(last, -1);
            
            int maxLen = 0;
            int left = 0;
            
            for (int right = 0; right < s.length(); right++) {
                char c = s.charAt(right);
                if (last[c] >= left) {
                    left = last[c] + 1;
                }
                last[c] = right;
                maxLen = Math.max(maxLen, right - left + 1);
            }
            
            return maxLen;
        }
    }
    
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.nextLine();
        
        Solution solution = new Solution();
        System.out.println(solution.lengthOfLongestSubstring(s));
    }
}
def length_of_longest_substring(s: str) -> int:
    last = {}  # 记录字符最后出现的位置
    max_len = left = 0
    
    for right, char in enumerate(s):
        # 如果字符已经在窗口中出现过,更新左边界
        if char in last and last[char] >= left:
            left = last[char] + 1
        # 更新字符最后出现的位置
        last[char] = right
        # 更新最大长度
        max_len = max(max_len, right - left + 1)
    
    return max_len

if __name__ == "__main__":
    s = input().strip()
    print(length_of_longest_substring(s))

算法及复杂度

  • 算法:滑动窗口
  • 时间复杂度:,其中 是字符串长度
  • 空间复杂度:,因为字符集大小是固定的
全部评论

相关推荐

行云流水1971:这份实习简历的优化建议: 结构清晰化:拆分 “校园经历”“实习经历” 板块(当前内容混杂),按 “实习→校园→技能” 逻辑排版,求职意向明确为具体岗位(如 “市场 / 运营实习生”)。 经历具象化:现有描述偏流程,需补充 “动作 + 数据”,比如校园活动 “负责宣传” 可加 “运营公众号发布 5 篇推文,阅读量超 2000+,带动 300 + 人参与”;实习内容补充 “协助完成 XX 任务,效率提升 X%”。 岗位匹配度:锚定目标岗位能力,比如申请运营岗,突出 “内容编辑、活动执行” 相关动作;申请市场岗,强化 “资源对接、数据统计” 细节。 信息精简:删减冗余表述(如重复的 “负责”),用短句分点,比如 “策划校园招聘会:联系 10 + 企业,组织 200 + 学生参与,到场率达 85%”。 技能落地:将 “Office、PS” 绑定经历,比如 “用 Excel 整理活动数据,输出 3 份分析表;用 PS 设计 2 张活动海报”,避免技能单独罗列。 优化后需强化 “经历 - 能力 - 岗位需求” 的关联,让实习 / 校园经历的价值更直观。 若需要进一步优化服务,私信
实习,投递多份简历没人回...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务