问题描述
给你一个字符串 word ,你可以向其中任何位置插入 "a"、"b" 或 "c" 任意次,返回使 word 有效 需要插入的最少字母数。如果字符串可以由 "abc" 串联多次得到,则认为该字符串 有效 。
示例 1:
输入:word = "b"
输出:2
解释:在 "b" 之前插入 "a" ,在 "b" 之后插入 "c" 可以得到有效字符串 "abc" 。
示例 2:
输入:word = "aaa"
输出:6
解释:在每个 "a" 之后依次插入 "b" 和 "c" 可以得到有效字符串 "abcabcabc"
提示:
1 <= word.length <= 50
word 仅由字母 "a"、"b" 和 "c" 组成。
解题思路
暴力解题
1.判断是否符合有效字符串规律
以字符串长度为循环条件对字符串进行遍历,对于每一位字母以及它之后的一位字母进行判断,是否符合有效字符串规律,例如:当前位字母为'a',下一位字母为'b',即符合有效字符串规律。
2.判断后进行字符串处理
若判断为不符合有效字符串规律,则在该位之后插入符合有效字符串规律的字母,例如:当前字母为'a',则插入'b',同时循环条件中字符串长度加一。
3.对特殊位置进行处理
对于字符串首位,若为'a'则不进行处理;若为'b',则字符串长度加一;若为'c',则字符串长度加二。
对于字符串末尾,若为'c'则不进行处理;若为'b',则字符串长度加一;若为'a',则字符串长度加二。
4.返回结果
以最终字符串长度减去初始字符串长度即为最终结果
5.具体代码
class Solution {
public int addMinimum(String word) {
int i=0;
StringBuilder temp = new StringBuilder(word);
int length = word.length();
for(;i<length-1;i++){
if(temp.charAt(i)=='a'&&temp.charAt(i+1)!='b'){
temp.insert(i+1,"b");
length++;
}else if(temp.charAt(i)=='b'&&temp.charAt(i+1)!='c'){
temp.insert(i+1,"c");
length++;
}else if(temp.charAt(i)=='c'&&temp.charAt(i+1)!='a'){
temp.insert(i+1,"a");
length++;
}
}
if(temp.charAt(0)=='b'){
length+=1;
}else if(temp.charAt(0)=='c'){
length+=2;
}
if(temp.charAt(i)=='a'){
length+=2;
}else if(temp.charAt(i)=='b'){
length++;
}
return length-word.length();
}
}
动态规划
1.思路规划
当字符串长度为0时,结果为0,设为d[0]=0;字符串长度为1时,结果为2,设为d[1]=2;字符串长度为2时,结果为d[1]+2或d[1]-1,当word[1]<=word[0]时,d[2]=d[1]+2,当word[1]>word[0]时,d[2]=d[1]-1。以此类推,当word[1]<=word[0]时,d[n]=d[n-1]+2;当word[1]>word[0]时,d[n]=d[n-1]-1。
2.代码如下
class Solution {
public int addMinimum(String word) {
int[] d = new int[51];
d[0] = 0;
d[1] = 2;
for(int i=1;i<word.length();i++){
d[i+1]=d[i]+2;
if(word.charAt(i)>word.charAt(i-1)){
d[i+1]=d[i]-1;
}
}
return d[word.length()];
}
}