小红书9.12 笔试第二题
给定一个非空字符串s,切割成若干个首尾相同的非空子串,求最少字串数量。
样例:
abaccd
输出:
3
100%AC答案:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String s = in.nextLine();
//构建dp数组,dp[i]代表的是前i个字符所能切成的最少字串数量
//比如: dp[4]代表的就是前4个字符,也就是dp[0]-dp[3]所切割的最少字串数量
int[] dp = new int[s.length()+1];
char[] chr = s.toCharArray();
//前i个字符能切的最大子串数量
//比如前3个字符最多能切三次
for (int i = 0; i <= s.length(); ++i) {
dp[i] = i;
}
dp[0] = 0;
//遍历字符数组
for (int i = 1;i<=s.length();i++){
//从后向前找,找到与当前s[i]相同的字符
for (int j = s.length(); j >= i; --j) {
//如果找到相同字符,进行状态转移
if (chr[i-1] == chr[j-1]) {
dp[j] = Math.min(dp[j],dp[i-1] + 1);
}
}
}
System.out.println(dp[s.length()]);
}
}
查看12道真题和解析