求最长子串长度

本文探讨了在给定字符串中寻找最长连续子串的方法,通过遍历和比较策略实现,详细介绍了算法的实现过程及代码示例。

题目

在一个以空格分割的字符串,如“asd asdasd sd asdasdas sdasdasdsdd”中,求最长字串长度,时间和空间复杂度尽可能最优

代码

#include <iostream>
using namespace std;

int main()
{
    int start=0,end=0,flag=0,temp=0;
    char str[]="asd asdasd sd asdasdas sdasdasdsdd";
    int len=(sizeof(str)/sizeof(str[0]));
    cout<<"字符串长度"<<len<<endl;
    while(end<len)
    {
        if(str[end]==' '||str[end]=='\0')
        {
            temp=end-start;
            if(flag<temp)
            {
                flag=temp;
                start+=(flag+1);
                end=start;
            }
            else
            {
                start+=(temp+1);
                end=start;
            }
        }
        else
        {
            end++;
        }
    }
    cout<<"最长子串长度"<<flag;
    return 0;
}

运行

1589160-20190315160223455-736838544.png

转载于:https://www.cnblogs.com/sunnylux/p/10537622.html

### 无重复字符最长长度算法实现 计算无重复字符最长长度是一个经典的滑动窗口问题。通过使用滑动窗口技术,可以高效地解决问题。以下是基于滑动窗口思想的详细算法描述和代码实现。 #### 算法描述 滑动窗口的核心思想是通过两个指针(`start` 和 `end`)维护一个动态变化的窗口,该窗口内的字符始终不重复。随着 `end` 指针向右移动扩展窗口,若遇到重复字符,则调整 `start` 指针以缩小窗口,直到窗口内再次没有重复字符。在此过程中,记录窗口的长度作为结果。 具体步骤如下: 1. 初始化两个指针 `start` 和 `end`,分别指向窗口的起始位置和结束位置。 2. 使用一个哈希集合(或哈希表)存储当前窗口内的字符,确保窗口内字符唯一。 3. 遍历字符,当发现重复字符时,移动 `start` 指针以移除重复字符。 4. 在每次迭代中更新大子长度。 5. 返回终的长度。 #### 代码实现 以下是基于 JavaScript 的实现: ```javascript var lengthOfLongestSubstring = function(s) { // 创建一个哈希集合,用于存储当前窗口内的字符 let charSet = new Set(); let maxLength = 0; // 最长长度 let start = 0; // 窗口起始位置 for (let end = 0; end < s.length; end++) { // 如果发现重复字符,调整窗口起始位置 while (charSet.has(s[end])) { charSet.delete(s[start]); start++; } // 将当前字符加入集合 charSet.add(s[end]); // 更新长度 maxLength = Math.max(maxLength, end - start + 1); } return maxLength; }; ``` 此外,也可以使用哈希表来优化查找重复字符的位置[^2]。以下是基于哈希表的 Python 实现: ```python def length_of_longest_substring(s: str) -> int: # 创建一个字典,用于存储字符及其后出现的位置 char_index_map = {} max_length = 0 # 大子长度 start = 0 # 窗口起始位置 for end in range(len(s)): if s[end] in char_index_map and char_index_map[s[end]] >= start: # 调整窗口起始位置 start = char_index_map[s[end]] + 1 # 更新字符新位置 char_index_map[s[end]] = end # 更新长度 max_length = max(max_length, end - start + 1) return max_length ``` #### 示例分析 以下是对几个示例的分析: 1. 输入 `"abcabcbb"`: - 输出:`3` - 解释:最长的无重复子为 `"abc"`[^1]。 2. 输入 `"bbbb"`: - 输出:`1` - 解释:最长的无重复子为 `"b"`[^1]。 3. 输入 `"pwwkew"`: - 输出:`3` - 解释:最长的无重复子为 `"wke"`[^1]。 #### 时间复杂度与空间复杂度 - **时间复杂度**:O(n),其中 n 是字符长度。每个字符多被访问两次(一次由 `end` 指针,一次由 `start` 指针)。 - **空间复杂度**:O(min(m, n)),其中 m 是字符集的大小,n 是字符长度坏情况下需要存储所有字符。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值