LeetCode:无重复字符的最长子串

我自己的解法思路很简单:使用一个vector容器存储每个不重复的字符串,并且依据它们的长度进行排序,比较关键的一点就是实现迭代器的“回滚”,比如"dvdf"字串中,在保留"dv"之后,如何使迭代器回滚到‘v'上。规律是迭代器减去每个存入的字符串长度减一,就是需要回滚的位置。
 

我的代码如下:

    if (s.size() == 0)
	{
		return 0;
	}
	if (s.size() < 2)
	{
		return s.size();
	}
	std::string::iterator iter = s.begin();
	std::vector<std::string> strList;

	while (iter!=s.end())
	{
		std::string temp;
		while (iter != s.end() && std::find(temp.begin(), temp.end(), *iter) == temp.end())
		{
			temp.push_back(*iter);
			iter++;
		}
		strList.push_back(temp);
        iter -= (temp.size() - 1);
	}

	std::sort(strList.begin(), strList.end(), [](std::string a, std::string b) {return a.size() < b.size(); });
	return strList.back().size();

事实证明我这个解法也是“擦边”过关,我练习leetcode的本身是练习思维,而不是“奇淫技巧”所以我在大神们的解法里,挑了个“符合我原则”的高效率写法学习。代码如下:

    int lengthOfLongestSubstring(string s) 
    {
        unordered_map<char, int> hashmap;
        int result = 0;
        int tmp = 0;
        int j = 0;
        for(int i = 0; i < s.size(); i++)
        {
            if(hashmap.find(s[i]) != hashmap.end())
            {
                j = max(j, hashmap[s[i]] + 1);
            }
            hashmap[s[i]] = i;
            result = max(result, i - j + 1);
        }        
        return result;
    }

大神的解法思路和我是一样的,但区别是他使用了unordered_map这个容器。使用字符串s中的元素做为键,下标作为值,如果容器中找到同样“键”的元素,那么作为起点的变量j,就移动到其后的一个位置。并且不需存储每一个字符串,通过每一个字符串遇上一个进行长度对比,来保留最大值;以"dvdf"为例:result = max(2,3);

猜你喜欢

转载自blog.csdn.net/qq_26818479/article/details/83246712