2022.03.27网易算法第二题

题目描述:

小红拿到了一个字符串,她可以做任意以下操作:

标记这个字符串两个位置相邻的字母,并且这两个字母必须满足以下条件才可以做标记:两个字母相同或者两个字母在字母表中相邻,小红可以获得这两个字母的分数。

举个例子:'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;
    }
}

你可能感兴趣的:(算法,java,算法)