动手刷LeetCode-无重复字符串的最长长度

无重复字符的最长字串


编程也是属于搭积木的游戏,能不重复造轮子就不造轮子;

知识点

操作字符串的知识点;字符串相当于是一个数组;
哈希表的的创建和使用方法;
动态规划的知识点;

解题思路

解法一:暴力法
具体步骤:创建一个字符串容器,首先放进去容器;
再遍历下一个元素,要是相等就略过,不相等就放进容器里面去;
最后新字符串的大小就是长度;

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        vector<char> ans; // 创建一个新的字符容器
        int a=0 ; // 盛放不重复字符串大小
        int i,j ;// 创建一个循环变量
        int len=s.length();

        if(s.length()==0){
            return 0;
        }

        if(s.length()==1){
            return 1;
        }

        for(i=0;i<len;i++){             //  遍历字符串的每一个字符
            for(j=0;j<ans.size();j++){  //  判断是否新的字符在新字符串里面有相等的
                if(s[i]==ans[j]){
                    
                    if(ans.size()>a){
                        a=ans.size();
                    }  // 不重复字符串大小

                    ans.clear();  // 清空
                    ans.push_back(s[i]);
                    
                    break;
                }
                
            }
            // 遍历循环玩新建字符串也没有相等的  
            if(j==ans.size()){
                ans.push_back(s[i]);
            }

        }
        if(a>ans.size()){
            return a;
        }else{
            return ans.size();
        }
    }
};	

解法2:滑动窗口
思想即用两个指引的变量,来指着滑动右指引;

class Solution
{
public:
    int lengthOfLongestSubstring(string s)
    {
        //s[start,end) 前面包含 后面不包含
        int start=0, end=0, length=0, result=0 ; // 定义并初始化变量
        int sSize = int(s.size());  // 字符串变量长度
        while (end < sSize)
        {
            char tmpChar = s[end];    // end 指的字符 
            for (int index = start; index < end; index++)
            {
                if (tmpChar == s[index])  // 如果在之前有重复的,就立刻把start指针重新指引
                {
                    start = index + 1;
                    length = end - start;
                    break;
                }
            }

            end++;
            length++;
            result = max(result, length);
        }
        return result;
    }
};

解法3:动态规划
借助动态规划的思路,从前到后求出以每个位置为终止位置,所构成无重复子串的长度,之后求这些长度的最大值即可。

public class Solution
{
    public int LengthOfLongestSubstring(string s)
    {
        if (string.IsNullOrEmpty(s))
            return 0;
        int[] result = new int[s.Length];
        result[0] = 1;

        for (int i = 1; i < s.Length; i++)
        {
            int count = GetLength(i, s);
            result[i] = result[i-1] < count ? result[i-1]+1 : count;
        }
        return result.Max();
    }
    private int GetLength(int index,string s)
    {
        char c = s[index];
        int result = 1;
        for (int i = index-1; i >= 0; i--)
        {
            if (s[i] != c)
                result += 1;
            else
                break;
        }
        return result;
    }
}

小结

能努力一次看懂的就一次看懂,不留遗憾,一旦错过了就真的错过了;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值