每日三题-编辑距离、分割等和子集、单词拆分

简介: 每日三题-编辑距离、分割等和子集、单词拆分

编辑距离


9c0f13f24c114ab199aa3dd8bef4d46a (1).png解法一

class Solution {
    public int minDistance(String word1, String word2) {
        int n1 = word1.length();
        int n2 = word2.length();
        int[][] dp = new int[n1 + 1][n2 + 1];
        // 第一行
        for (int j = 1; j <= n2; j++) dp[0][j] = dp[0][j - 1] + 1;
        // 第一列
        for (int i = 1; i <= n1; i++) dp[i][0] = dp[i - 1][0] + 1;
        for (int i = 1; i <= n1; i++) {
            for (int j = 1; j <= n2; j++) {
                if (word1.charAt(i - 1) == word2.charAt(j - 1)) dp[i][j] = dp[i - 1][j - 1];
                else dp[i][j] = Math.min(Math.min(dp[i - 1][j - 1], dp[i][j - 1]), dp[i - 1][j]) + 1;
            }
        }
        return dp[n1][n2];  
    }
}


分割等和子集


153dea1e7bef4a89a1a27d643c057e60.png

解法一

class Solution {
    public boolean canPartition(int[] nums) {
        int len = nums.length;
        if (len < 2) return false;
        int sum = 0;
        int max = 0;
        for(int i : nums){
            max = Math.max(max,i);
            sum+=i;
        }
        if(sum %2 != 0) return false;
        int target = sum/2;
        if(max > target) return false;
        if(max == target) return true;
        //dp[i][j]  数组表示的是在0-i中,背包容量为j的最大价值
        int dp[][] = new int[len+1][target+1];
        for(int i = 1;i <= len;i++){        
            for(int j = 1;j <= target;j++){
                if(j >= nums[i-1]){
                    dp[i][j] = Math.max(dp[i-1][j],dp[i-1][j-nums[i-1]]+nums[i-1]);
                }else{
                    dp[i][j] = dp[i-1][j];
                }
            }
        }
        if(dp[len][target] == target) return true;
        return false;
    }
}


单词拆分


c10e8a0bf6ac48c3ab796a1241f95b47.png

解法一

class Solution {
    public boolean wordBreak(String s, List<String> wordDict) {
        int dp[] = new int[s.length()+1];
        dp[0] = 1;
        for(int i = 1;i <= s.length();i++){
            for(int j = 0;j < i;j++){
                if(dp[j] == 1 && wordDict.contains(s.substring(j,i))){
                    dp[i] = 1;
                    break;
                }
            }
        }
        return dp[s.length()] == 1;
    }
}
相关文章
|
7月前
|
Java C++
leetcode-139:单词拆分
leetcode-139:单词拆分
71 0
|
7月前
|
存储 算法 程序员
【算法训练-回溯算法 二】【子集组合问题】子集、组合、子集II、组合总和
【算法训练-回溯算法 二】【子集组合问题】子集、组合、子集II、组合总和
68 0
|
6月前
|
Python
每日一题 2047. 句子中的有效单词数
每日一题 2047. 句子中的有效单词数
|
7月前
|
自然语言处理
leetcode-140:单词拆分 II
leetcode-140:单词拆分 II
48 0
|
算法
【学会动态规划】单词拆分(24)
【学会动态规划】单词拆分(24)
47 0
倒置字符串(倒置单词,标点不倒置)
倒置字符串(倒置单词,标点不倒置)
57 0
【每日挠头算法题(8)】最后一个单词的长度|重新排列字符串
【每日挠头算法题(8)】最后一个单词的长度|重新排列字符串
算法练习Day46|139.单词拆分
算法练习Day46|139.单词拆分
|
算法 Java C++
leetcode单词拆分
leetcode单词拆分
|
安全 算法 索引
对字符串进行分割并且补位的算法解析
重点掌握StringBuilder和StringBuffer和String的区别
对字符串进行分割并且补位的算法解析