一、力扣
1、交错字符串
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、阿拉伯数字转中文
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;
}
}