严正声明:转载请注明出处!!!
题目描述:
小红拿到了一个字符串,她可以做任意以下操作:
标记这个字符串两个位置相邻的字母,并且这两个字母必须满足以下条件才可以做标记:两个字母相同或者两个字母在字母表中相邻,小红可以获得这两个字母的分数。
举个例子:'a’和’b’在字母表相邻,'t’和’s’在字母表相邻。
我们规定,已经被标记的字母无法被重复标记。
每个字符获得的分数是不同的,'a’可以获得1分,'b’可以获得2分,以此类推,'z’可以获得26分。
输入描述:
输入一行只包含小写字母的非空字符串s,代表小红拿到的字符串。1≤len(s)≤200000
输出描述:
小红可以获得的最大分数
示例1:
输入
abdbb
输出
7
说明
第一次标记前两个字母'a'和'b',获得3分,第二次标记后两个字母'b'和'b',获得4分。
示例2:
输入
abb
输出
4
import java.util.HashMap;
import java.util.Scanner;
public class Main {
public static int[] score = new int[26];
public static char[] array;
public static HashMap<Integer, Integer> map = new HashMap<>();
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s = sc.next();
array = s.toCharArray();
for(int i = 0;i < 26;i++){
score[i] = i + 1;
}
System.out.println(getMaxScore(0));
}
public static int getMaxScore(int index){
if(index >= array.length - 1){
return 0;
}
if(map.containsKey(index)){
return map.get(index);
}
int cur = 0;
if(Math.abs(array[index] - array[index + 1]) <= 1){
int pre = array[index] - 'a';
int aft = array[index + 1] - 'a';
cur = score[pre] + score[aft];
}
int max = Math.max(cur + getMaxScore(index + 2), getMaxScore(index + 1));
map.put(index, max);
return max;
}
}