博客记录-day173-力扣

29 阅读2分钟

一、力扣

1、交错字符串

97. 交错字符串

image.png

class Solution {
    public boolean isInterleave(String s1, String s2, String s3) {
        int m = s1.length(), n = s2.length(), k = s3.length();
        // 如果s1和s2的总长度不等于s3的长度,直接返回false
        if (m + n != k) return false;
        
        // dp[i][j]表示s1的前i个字符和s2的前j个字符能否交错组成s3的前i+j个字符
        boolean[][] dp = new boolean[m + 1][n + 1];
        dp[0][0] = true; // 空字符串的初始状态
        
        // 处理s2为空的情况:s1是否与s3完全匹配
        for (int i = 0; i < m; i++) {
            // 逐个字符比较s1和s3,若匹配则延续状态
            if (s1.charAt(i) == s3.charAt(i)) {
                dp[i + 1][0] |= dp[i][0];
            }
        }
        
        // 处理s1为空的情况:s2是否与s3完全匹配
        for (int i = 0; i < n; i++) {
            // 逐个字符比较s2和s3,若匹配则延续状态
            if (s2.charAt(i) == s3.charAt(i)) {
                dp[0][i + 1] |= dp[0][i];
            }
        }
        
        // 填充dp数组:遍历所有可能的i和j组合
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                // 当前需匹配s3的第i+j+1个字符(因为已匹配i+j个)
                int pos = i + j + 1; // s3中待匹配的字符位置
                // 情况1:使用s1的第i个字符
                if (s1.charAt(i) == s3.charAt(pos)) {
                    dp[i + 1][j + 1] |= dp[i][j + 1]; // 从左侧状态转移(不使用当前j)
                }
                // 情况2:使用s2的第j个字符
                if (s2.charAt(j) == s3.charAt(pos)) {
                    dp[i + 1][j + 1] |= dp[i + 1][j]; // 从上侧状态转移(不使用当前i)
                }
            }
        }
        // 返回最终结果:s1和s2全部字符能否组成s3
        return dp[m][n];
    }
}

2、阿拉伯数字转中文

阿拉伯数字转中文

image.png

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param n int整型 
     * @return string字符串
     */
    public String num2cn (int n) {
        // 特殊情况0,直接返回零
        if(n == 0) return "零";
        // 数字数组
        String[] chinese = {"零","一","二","三","四","五","六","七","八","九"};
        // 位数数组
        String[] chs = {"", "十", "百", "千", "万", "十", "百", "千", "亿", "十", "百", "千"};
        StringBuilder res = new StringBuilder();
        // 负数标记
        boolean negative = false;
        if(n < 0) {
            negative = true;
            n *= -1;
        }
        // 进位
        int carry = 0;
        while(n > 0) {
            // 特殊情况:11,输出一十一;应该输出十一。
            if(n == 1 && chs[carry].equals("十")) {
                res.append(chs[carry]);
            } else {
            // 因为最后要反转,所以先加入位数再加入数字
                res.append(chs[carry]);
                res.append(chinese[n % 10]);
            }
            n /= 10;
            carry++;
        }
        // [1]:将零万、零百、零千、零十换成零
        // [2]:将零亿换成亿
        // [3]:将亿万换成亿
        // [4]:合并中间多个零为一个零
        // [5]:移除末尾的零
        String str = res.reverse().toString().replaceAll("零[万千百十]", "零")
        .replaceAll("零+亿", "亿")
        .replaceAll("零+", "零")
        .replaceAll("零$", "");
        
        return negative ? "负" + str : str;
    }
}