之前一道dp题没跑通用例,记在这里一下
这题意思大概就是,给你一串由大小写字母组成的字符串,问你键盘打出它最少要敲多少下。键盘开始的状态是小写字母,按住shift+键入字母算两次敲击,按大小写切换再键入字母也算两次敲击(不过此时大小写状态改变了)
例子🌰: iloVeuu 八下(用shift+v) 或九下(切换大写,V,切换小写)
很明显的两个状态的dp,上代码:
let T = read_line();
T = +T;
for (let i = 0; i < T; i++) {
let s = read_line();
s = s.trim();
console.log(fn(s));
}
function fn(str) {
let n = str.length;
let dp = new Array(n + 1).fill(0).map(() => new Array(2).fill(0));
dp[0][1] = 1;
for (let i = 1; i <= n; i++) {
//+2是shift+字母; +1+1是切换大小写再键入字母
if (isUppercase(str[i - 1])) {
dp[i][0] = Math.min(dp[i - 1][0] + 2, dp[i - 1][1] + 1 + 1);
dp[i][1] = Math.min(dp[i - 1][0] + 1 + 1, dp[i - 1][1] + 1);
} else {
dp[i][0] = Math.min(dp[i - 1][0] + 1, dp[i - 1][1] + 1 + 1);
dp[i][1] = Math.min(dp[i - 1][0] + 1 + 1, dp[i - 1][1] + 2);
}
}
return Math.min(dp[n][0], dp[n][1]);
}
function isUppercase(str) {
return str == str.toUpperCase();
}
部分用例跑不通,有时间再捣腾下吧,若有老哥能帮俺偷个懒指出哪里有问题感激不尽!