题目描述:给定一个字符串求最小的点按键击次数。

键盘按键Caps Lock可以切换大小写模式,在小写模式下,shift+字母可以输入单个大写字母。
注意:shift+字母算两次按键,默认初始状态是小写模式。

算法思想

算法思想
需要注意的是: 这两种方法都需要补上当最后一个字符和倒数第二个字符都是大写的情况。此时不需要再按一次caps切换回小写,所以要-1

代码实现

//解1、状态转移法/马尔科夫链
var str = "aAAaA" // output = 8 = 1+4+1+2
// var str = "AaAAAA"; //output = 8 = 2+1+5
// var str = "aaAAaAaAAA" //output = 14 = 2+4+1+2+1+4
// var str = "aaAAaAaAAAa" //output = 16 = 2+4+1+2+1+5+1

function isLower(c) {
    return ('a' <= c && c <= 'z')? true:false;
}

var sum = (isLower(str.charAt(0)) && isLower(str.charAt(1)))? 2:3;

var f = new Array(2);
var l = new Array(2);

for (let idx = 0; idx < str.length - 2; idx++) {
    f = [isLower(str.charAt(idx)),isLower(str.charAt(idx+1))];
    l = [isLower(str.charAt(idx+1)),isLower(str.charAt(idx+2))];
    markovHandler(f,l);
    console.log(f,l,str.charAt(idx+2),sum); //打完str.charAt(idx+2)需要按多少下sum
}

if (!isLower(str.slice(-1)) && !isLower(str.slice(-2,-1))) {
    sum -= 1;
}
console.log(sum);

function markovHandler(former,latter) {
    if (former[0]==true&&former[1]==true &&latter[0]==true && latter[1]==true ) { sum += 1;} //00 => 00
    if (former[0]==true&&former[1]==true &&latter[0]==true && latter[1]==false ) { sum += 2;} //00 => 01
    if (former[0]==true&&former[1]==false &&latter[0]==false && latter[1]==false ) { sum += 2;} //01 => 11
    if (former[0]==true&&former[1]==false &&latter[0]==false && latter[1]==true ) { sum += 1;} //01 => 10
    if (former[0]==false&&former[1]==false &&latter[0]==false && latter[1]==false ) { sum += 1;} //11 => 11
    if (former[0]==false&&former[1]==false &&latter[0]==false && latter[1]==true ) { sum += 1;} //11 => 10
    if (former[0]==false&&former[1]==true &&latter[0]==true && latter[1]==false ) { sum += 2;} //10 => 01
    if (former[0]==false&&former[1]==true &&latter[0]==true && latter[1]==true ) { sum += 1;} //10 => 00
}
//解2、普通逻辑
// var str = "aAAaA" // output = 8 = 1+4+1+2
// var str = "AaAAAA"; //output = 8 = 2+1+5
// var str = "aaAAaAaAAA" //output = 14 = 2+4+1+2+1+4
var str = "aaAAaAaAAAa" //output = 16 = 2+4+1+2+1+5+1
function isLower(c) {
    return ('a' <= c && c <= 'z')? true:false;
}

var un = [];
str.split('').map( (char)=>{
    isLower(char)? un.push(0):un.push(1);
});

var sum = 0, count =0;
for (let index = 0; index < un.length; index++) {
    const element = un[index];
    if (element == 0) {
        count = 0;
        sum += 1;
    } else {
        count ++;
        sum += (count<3)? 2:1;
    }
    // console.log(str.charAt(index), count, sum);
}

if (!isLower(str.slice(-1)) && !isLower(str.slice(-2,-1))) {
    sum -= 1;
}
console.log(sum);