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;
    }
}
  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值