算法问题记录1

91 阅读1分钟

之前一道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();
}

部分用例跑不通,有时间再捣腾下吧,若有老哥能帮俺偷个懒指出哪里有问题感激不尽!