Substrings of size K with K distinct chars

Given a string s and an int k, return an int representing the number of substrings (not unique) of s with exactly k distinct characters. If the given string doesn't have k distinct characters, return 0.
https://leetcode.com/problems/subarrays-with-k-different-integers

Example 1:

Input: s = "pqpqs", k = 2
Output: 7
Explanation: ["pq", "pqp", "pqpq", "qp", "qpq", "pq", "qs"]

思路:这题思路很巧妙,我是看了上面那个 subarrays with k different integers 的花花视频才懂的。

直接求很难,但是我们可以转换成 f(k) - f(k-1)  f(k)表示最多不大于k(at most k)的char的string的个数, at most k, 可以用sliding window的双指针来做,count 就是 j - i,表示以j - 1 为尾巴的subarray的个数;

public class numberOfUniqueChars {
    public int getAtMostKCharacters(String s, int k) {
        if(s == null || s.length() == 0) {
            return 0;
        }

        int j = 0;
        int[] counts = new int[256];
        int c = 0;
        int ans = 0;
        for(int i = 0; i < s.length(); i++) {
            // move j;
            while(j < s.length() && c <= k) {
                if(counts[s.charAt(j)] == 0 ) {
                    if(c == k) {
                        break;
                    }
                    c++;
                }
                counts[s.charAt(j)]++;
                j++;
            }

            //update result;
            ans += j - i;

            // remove i;
            counts[s.charAt(i)]--;
            if(counts[s.charAt(i)] == 0) {
                c--;
            }
        }

        return ans;
    }

    public static void main(String[]  args) {
        /*
        *
        * Input: s = "pqpqs", k = 2
          Output: 7
          Explanation: ["pq", "pqp", "pqpq", "qp", "qpq", "pq", "qs"]
        * */
        numberOfUniqueChars numberOfUniqueChars = new numberOfUniqueChars();
        String s = "pqpqs";
        int ans1 = numberOfUniqueChars.getAtMostKCharacters(s, 2) - numberOfUniqueChars.getAtMostKCharacters(s, 1);
        // ans = 7;
        System.out.println("ans: " + ans1);

    }
}

 

### 在 PostgreSQL 中使用字符串函数截取字段的值 在 PostgreSQL 中,可以利用多种内置字符串函数来实现对字段值的截取操作。以下是几种常见的方法及其具体应用: #### 方法一:使用 `SUBSTRING` 截取字符串 `SUBSTRING` 是一种灵活的字符串截取方式,支持基于起始位置和长度的方式进行截取。例如,如果要从字符串 `'PostgreSQL'` 的第 8 位开始截取两位字符,则可以通过以下 SQL 实现: ```sql SELECT SUBSTRING('PostgreSQL', 8, 2); -- 返回结果: QL [^1] ``` 对于动态字段名的情况,假设表名为 `t_example`,字段名为 `field_name`,则可以在查询中这样写: ```sql SELECT SUBSTRING(field_name FROM position FOR length) FROM t_example; ``` 其中,`position` 表示起始位置,`length` 表示需要截取的字符数。 --- #### 方法二:通过正则表达式提取子串 当需要更复杂的匹配逻辑时,可以借助正则表达式的功能。PostgreSQL 提供了自定义函数 `regexp_substr` 来完成这一需求[^4]。例如,若需从某个字段中提取符合特定模式的部分,可按如下方式编写: ```sql CREATE OR REPLACE FUNCTION pg.regexp_substr(text, text) RETURNS text LANGUAGE sql IMMUTABLE STRICT AS $$ SELECT (unnest(regexp_matches($1, $2)))[1]; $$; -- 使用该函数执行正则匹配并获取第一个分组的结果 SELECT pg.regexp_substr(field_name, 'pattern') FROM t_example; ``` 这里,“pattern”应替换为你实际使用的正则表达式。 --- #### 方法三:结合其他辅助函数处理复杂场景 有时仅靠单一函数难以满足业务需求,此时可通过组合多个函数达成目的。比如要去掉某些特殊符号或者前后多余的空白区域,就可以先调用 `TRIM()` 或者类似的清理工具再做进一步加工[^3]: ```sql SELECT TRIM(BOTH '"' FROM field_name) FROM t_example; -- 移除首尾双引号实例 ``` 另外,在面对混合型数据列(如包含文字描述与数值编码混杂在一起的情形),可能还需要额外转换步骤才能得到纯粹意义上的数字部分作为最终输出项之一[^5]: ```sql SELECT DISTINCT CAST(split_part(remark , delimiter, index) AS INTEGER) num FROM t_department WHERE remark LIKE pattern_string ESCAPE escape_character ORDER BY num DESC LIMIT count_limit ; ``` 以上展示了不同条件下如何运用相应的字符串操纵技术于实践当中解决问题的办法。 --- ### 示例代码总结 综合来看,下面给出一段完整的示范程序用于演示这些技巧的实际效果: ```sql DO $$ BEGIN PERFORM set_config('search_path','public',false); END $$ ; DROP TABLE IF EXISTS test_strings CASCADE ; CREATE TEMPORARY TABLE test_strings ( id serial primary key, strdata varchar NOT NULL DEFAULT '' ); INSERT INTO test_strings(strdata) VALUES ('abcde'),('fghij'),('klmno'); WITH processed_data AS( SELECT *, substring(strdata from char_length(strdata)-1 for 2 ) last_two_chars , upper(substring(strdata from 1 for 1 )) first_char_uppercased FROM test_strings ) SELECT * FROM processed_data pd ; PREPARE find_pattern_in_column(varchar,integer,text[])AS WITH filtered_rows AS(SELECT * FROM test_strings ts WHERE POSITION($1 IN ts.strdata)>=$2 ), extracted_values AS( SELECT regexp_replace(array_to_string($3,'|'),'\\W','','g') cleaned_patterns_list , unnest(string_to_array(cleaned_patterns_list ,'')) single_clean_token FROM dual d ) SELECT fr.*,ev.single_clean_token matched_tokens FROM filtered_rows fr JOIN LATERAL extracted_values ev ON true WHERE strpos(fr.strdata,ev.single_clean_token)!=0 ; EXECUTE find_pattern_in_column('c',3,array['a','b','c']); DEALLOCATE ALL ; ``` 此脚本创建了一个临时测试表格,并对其进行了各种形式的数据变换展示,包括但不限于简单的 substrings 获取以及高级别的 regex 查找等功能集成案例分析说明文档撰写完毕后的验证环节必不可少! ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值