列表

详情


NC356. 至多包含K种字符的子串

描述

给定一个长度为 n 的字符串 s ,找出最多包含 k 种不同字符的最长连续子串的长度。

数据范围: , 字符串中仅包含小写英文字母

示例1

输入:

"abcck",1

输出:

2

示例2

输入:

"abcck",2

输出:

3

说明:

最后三个字符 “cck” 组成最长子串

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 6ms, 内存消耗: 780KB, 提交时间: 2022-05-08

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param s string字符串 
     * @param k int整型 
     * @return int整型
     */
    int longestSubstring(string s, int k) {
        // write code here
        int arr[256]={0};
        int maxLength=0;
        int diff=0;//记录不同字符的种类
        int R=0;//其中R是窗口又边界
        for(int i=0;i<s.size();i++)
        {
            while(R<s.size()&&(diff<k||(diff==k&&arr[s[R]]>0)))
            {
                diff+=arr[s[R]]==0?1:0;
                arr[s[R++]]++;
            }
            //窗口第一次来到违规的位置
            maxLength=max(maxLength,R-i);
            diff-=arr[s[i]]==1?1:0;
            arr[s[i]]--;//出现次数减少
        }
        return maxLength;
    }
};

C++ 解法, 执行用时: 6ms, 内存消耗: 784KB, 提交时间: 2022-07-03

class Solution {
  public:
    int longestSubstring(string s, int k) {
        int a[256] = {0};
        int h = 0, x = 0, j = 0;
        
        for (int i = 0; i < s.size(); i++) {
            while (j < s.size() && (x < k || (x == k && a[s[j]] > 0))) {
                x += a[s[j]] == 0 ? 1 : 0;
                a[s[j++]]++;
            }
            h = max(h, j - i);
            x -= a[s[i]] == 1 ? 1 : 0;
            a[s[i]]--;
        }
        return h;
    }
};

C 解法, 执行用时: 7ms, 内存消耗: 652KB, 提交时间: 2022-06-26

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param s string字符串 
 * @param k int整型 
 * @return int整型
 *
 * C语言声明定义全局变量请加上static,防止重复定义
 */
int max(int a, int b) {
    return a > b ? a : b;
}

int longestSubstring(char* s, int k ) {
    int maxLen = 0, sLen = strlen(s), chCount = 0, chHash[26] = { 0 }, key;
    int i = 0, j = 0;
    while(j < sLen) {
        key = s[j] - 'a';
        if (chHash[key] == 0) {
            chHash[key] = 1;
            chCount++;
        } else {
            chHash[key] += 1;
        }
        if (chCount == k + 1) {
            maxLen = max(maxLen, j-i);
            
            while(i < j) {
                chHash[s[i]-'a'] -= 1;
                
                i++;
                
                if (chHash[s[i-1]-'a'] == 0) {
                    chCount--;
                    break;
                }
            }
        }
        
        j++;
    }
    if (chCount <= k) {
        maxLen = max(maxLen, j - i);
    }
    
    return maxLen;
}


C 解法, 执行用时: 7ms, 内存消耗: 684KB, 提交时间: 2022-07-18

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param s string字符串 
 * @param k int整型 
 * @return int整型
 *
 * C语言声明定义全局变量请加上static,防止重复定义
 */
int longestSubstring(char* s, int k ) {
    // write code here
    if(!k)
        return 0;
    int length=strlen(s);
    int left=0,right=0;
    int maxlength=1;  //记录最长子串长度
    int count=0;  //记录窗口中不同字符的个数
    int hash[128]={0};  //用哈希表来记录窗口中各字符个数,0表示不在窗口,非零整数表示在窗口
    while(right<length){
        hash[s[right]]++;
        if(hash[s[right]]==1)   //哈希表里唯一的该字符  
            count++;
        while(count>k){ //如果窗口里不同字符数超过k,移动left指针    
            hash[s[left]]--;
            if(hash[s[left]]==0)
                count--;
            left++;
        }
        maxlength=fmax(maxlength,right-left+1);
        right++;
    }
    return maxlength;
}

C 解法, 执行用时: 7ms, 内存消耗: 684KB, 提交时间: 2022-07-03

int max(int a, int b) {return a > b ? a : b;}

int longestSubstring(char* s, int k ) {
    int a[256] = {0};
    int h = 0, x = 0, j = 0;
    for (int i = 0; i < strlen(s); i++) {
        while (j < strlen(s) && (x < k || (x == k && a[s[j]] > 0))) {
            x += a[s[j]] == 0 ? 1 : 0;
            a[s[j++]]++;
        }
        h = max(h, j - i);
        x -= a[s[i]] == 1 ? 1 : 0;
        a[s[i]]--;
    }
    return h;
}

上一题