c++之哈希表

题目描述:

给定一个字符串 S,请你找出其中不含有重复字符的最长子串(与最长子序列进行区分)的长度。

思路:递增地枚举子串地初始位置,则最长子串的结束位置是不递减的。因此可以使用滑动窗口进行解题,定义两个指针分别指向子串的起始和终止位置,定义一个哈希表进行字串中元素是否重复的判断。

C++ STL unordered_set无序哈希基本操作(本题):

创建:std::unordered_set<类型> hash_set(名称)

插入:hash_set.insert()

查找值为key的元素个数:hash_set.count()

public:
    int lengthOfLongestSubstring(string s) {
        unordered_set<char> hash_set;
        int n=s.size();
        int ans=0;
        int hash_size=0;
        int k=-1;
        for(int i=0;i<n;i++){
            if(i!=0)hash_set.erase(s[i-1]);
            while(k+1<n){
                if(hash_set.count(s[k+1])==0){
                    hash_set.insert((s[k+1]));
                    k++;
                }
                else break;
            }
            ans=max(ans,k-i+1);
        }
        return ans;
    }
};

由滑动窗口使用双指针的思想联想到另一题:“两个有序数组的合并”

思路一:类似双指针分别指向两个数组的初始位置,进行比较取出较小的并将该指针进行右移。

public:
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
        int p1 = 0, p2 = 0;
        int sorted[m + n];
        int cur;
        while (p1 < m || p2 < n) {
            if (p1 == m) {
                cur = nums2[p2++];
            } else if (p2 == n) {
                cur = nums1[p1++];
            } else if (nums1[p1] < nums2[p2]) {
                cur = nums1[p1++];
            } else {
                cur = nums2[p2++];
            }
            sorted[p1 + p2 - 1] = cur;
        }
        for (int i = 0; i != m + n; ++i) {
            nums1[i] = sorted[i];
        }
    }

思路二:对两个数组分别从最大的元素进行比较一步步从后往前填充

public:
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
        int i=m-1;
        int j=n-1;
        int k=m+n-1;
        while(i!=-1&&j!=-1){
            if(nums1[i]>nums2[j]){
                nums1[k]=nums1[i];
                i--;
                k--;
            }
            else{
                nums1[k]=nums2[j];
                j--;
                k--;
            }
        }
        if(i==-1){
            for(int m=0;m<j+1;m++){
                nums1[m]=nums2[m];
            }
        }

    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值