day-04 字符串中的额外字符

文章描述了一种使用动态规划方法解决字符串问题的方法,计算在给定字符串中使每个字符不是额外字符所需的最少字符数,通过比较字符串子串与字典中的元素来更新最少额外字符数。

在这里插入图片描述
思路
动态规划,每个字符要么额外要么不是额外

解题方法
int[] dp = new int[n+1];
dp[i] 表示从字符串开头到字符串索引i位置的最少额外字符数
dp[i + 1] = Math.min(dp[i + 1], dp[j])
dp[j]表示假设s第i个字符不是额外的,可能等于dp[i + 1],也可能等于dp[i + 1]-1

code

class Solution {
    public int minExtraChar(String s, String[] dictionary) {
        int n = s.length();
        int[] dp = new int[n+1];  // dp[i+1] 表示从字符串开头到字符串索引i位置的最少额外字符数
        Set<String> dictionarySet = new HashSet<>();
        for(String word: dictionary){
            dictionarySet.add(word);        //依次存入set中
        }
        for(int i = 0; i < n; i++){
            dp[i + 1] = dp[i] + 1;  // 字符串i对应的位置字符是额外字符
            for(int j = 0; j <= i; j++){    // 假设字符串i对应的位置字符是额外字符
                if(dictionarySet.contains(s.substring(j, i + 1))){
                    dp[i + 1] = Math.min(dp[i + 1], dp[j]);
                }
            }
        }
        return dp[n];   // dp[n] 即为额外最少字符数
    }
}

substring(int beginIndex):从指定索引位置 beginIndex(包括)开始截取字符串的剩余部分。

substring(int beginIndex, int endIndex):从指定索引位置 beginIndex(包括)开始截取字符串,直到索引位置 endIndex(不包括)为止。

dictionarySet.contains(s.substring(j, i + 1)) set中是否有字符串 s[i]–s[j-1]

注:不会,看了题解,哈哈。。。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值