​力扣解法汇总1807. 替换字符串中的括号内容

news/2024/7/2 14:48:26

 目录链接:

力扣编程题-解法汇总_分享+记录-CSDN博客

GitHub同步刷题项目:

https://github.com/September26/java-algorithms

原题链接:力扣


描述:

给你一个字符串 s ,它包含一些括号对,每个括号中包含一个 非空 的键。

  • 比方说,字符串 "(name)is(age)yearsold" 中,有 两个 括号对,分别包含键 "name" 和 "age" 。

你知道许多键对应的值,这些关系由二维字符串数组 knowledge 表示,其中 knowledge[i] = [keyi, valuei] ,表示键 keyi 对应的值为 valuei 。

你需要替换 所有 的括号对。当你替换一个括号对,且它包含的键为 keyi 时,你需要:

  • 将 keyi 和括号用对应的值 valuei 替换。
  • 如果从 knowledge 中无法得知某个键对应的值,你需要将 keyi 和括号用问号 "?" 替换(不需要引号)。

knowledge 中每个键最多只会出现一次。s 中不会有嵌套的括号。

请你返回替换 所有 括号对后的结果字符串。

示例 1:

输入:s = "(name)is(age)yearsold", knowledge = [["name","bob"],["age","two"]]
输出:"bobistwoyearsold"
解释:
键 "name" 对应的值为 "bob" ,所以将 "(name)" 替换为 "bob" 。
键 "age" 对应的值为 "two" ,所以将 "(age)" 替换为 "two" 。

示例 2:

输入:s = "hi(name)", knowledge = [["a","b"]]
输出:"hi?"
解释:由于不知道键 "name" 对应的值,所以用 "?" 替换 "(name)" 。

示例 3:

输入:s = "(a)(a)(a)aaa", knowledge = [["a","yes"]]
输出:"yesyesyesaaa"
解释:相同的键在 s 中可能会出现多次。
键 "a" 对应的值为 "yes" ,所以将所有的 "(a)" 替换为 "yes" 。
注意,不在括号里的 "a" 不需要被替换。

提示:

  • 1 <= s.length <= 105
  • 0 <= knowledge.length <= 105
  • knowledge[i].length == 2
  • 1 <= keyi.length, valuei.length <= 10
  • s 只包含小写英文字母和圆括号 '(' 和 ')' 。
  • s 中每一个左圆括号 '(' 都有对应的右圆括号 ')' 。
  • s 中每对括号内的键都不会为空。
  • s 中不会有嵌套括号对。
  • keyi 和 valuei 只包含小写英文字母。
  • knowledge 中的 keyi 不会重复。

解题思路:

* 解题思路:
* 首先根据knowledge生成一个map进行映射。
* 然后开始从s中寻找(,找到后记录其位置为startIndex,
* 再开始寻找),找到后记录其位置为endIndex,截取key,如果map中存在,则替换。
* 如果找不到(,则startIndex=-1,跳出循环,最后完成拼接即可。
 

代码:

public class Solution1807 {

    public String evaluate(String s, List<List<String>> knowledge) {
        Map<String, String> map = new HashMap<>();
        for (List<String> keyvalue : knowledge) {
            String key = keyvalue.get(0);
            String value = keyvalue.get(1);
            map.put(key, value);
        }
        int startIndex = 0;
        int endIndex = 0;
        boolean isStart = false;
        StringBuilder builder = new StringBuilder();
        while (true) {
            if (isStart) {
                endIndex = s.indexOf(")", startIndex);
                String key = s.substring(startIndex + 1, endIndex);
                String value = map.getOrDefault(key, "?");
                builder.append(value);
                isStart = false;
                endIndex++;
                continue;
            }
            startIndex = s.indexOf("(", endIndex);
            if (startIndex == -1) {
                break;
            }
            if (startIndex > endIndex) {
                builder.append(s, endIndex, startIndex);
            }
            isStart = true;
        }
        builder.append(s, endIndex, s.length());
        return builder.toString();
    }
}


http://lihuaxi.xjx100.cn/news/633580.html

相关文章

Puppeteer之Pyppeteer——Pyppeteer基础用法入门

前言 本文是该专栏的第1篇,本专栏初衷是让你学会使用pyppeteer从小白到精通,后面会持续分享Pyppeteer的干货知识,记得关注。 Pyppeteer是Puppeteer是Python版本,是Google基于Node.js开发的工具,可以通过JavaScript代码来操作chrome。所以在浏览器中绝大多数操作都可以使用…

NFS4协议

介绍 一些定义 客户端&#xff1a;访问NFS服务器资源的实体&#xff0c;可以是包含直接访问NFS服务器的应用程序&#xff0c;也可以是为一组应用程序提供远程文件系统服务的传统操作系统客户端。 客户端由客户端所有者唯一标识关于字节范围锁定&#xff0c;客户端也代表一个或…

Nexus私有maven库部署和使用

原文地址:Nexus私有maven库部署和使用 - Stars-One的杂货小窝前段圣诞节前后,Jitpack网站突然崩溃了,无法下载依赖,然后过了一个星期才解决了,好在没啥紧急的Android开发任务,没啥影响,但是也给我了一些提醒,可能搭建个私有库会比较保险,于是就是研究了私有库nexus的部…

Python logging 库的『完整教程』

前言 本文的标题是『完整』。所谓『完整』&#xff0c;大意是想表达&#xff1a;提炼出一组最小的经验组合&#xff0c;并且能够快速应用于工程中&#xff0c;能 work&#xff0c;甚至能完美地 work。这篇文章就是想要做到『如何能完美地work』。 初衷 最原始的初衷就是&…

Acwing4653. 数位排序

小蓝对一个数的数位之和很感兴趣&#xff0c;今天他要按照数位之和给数排序。 当两个数各个数位之和不同时&#xff0c;将数位和较小的排在前面&#xff0c;当数位之和相等时&#xff0c;将数值小的排在前面。 例如&#xff0c;2022 排在 409 前面&#xff0c;因为 2022 的数…

【Java集合】Collections工具类

文章目录01 Collections工具类介绍02 排序操作03 查找、替换01 Collections工具类介绍 Collections 是一个操作 Set、List 和 Map 等集合的工具类&#xff1b;Collections 中提供了一系列静态方法对集合元素进行排序、查询和修改操作&#xff1b; 02 排序操作 均为static方法…

如何成功发送一个Target 846 EDI报文?

Target塔吉特公司是仅次于沃尔玛的第二大零售百货集团&#xff0c;为客户提供当今时尚前沿的零售服务&#xff0c;物美价廉。而EDI&#xff08;电子数据交换&#xff09;是Target与供应商进行业务往来时要求使用的数据交换方式&#xff0c;具有安全可靠、高效和降低人工成本等优…

Java--String字符串处理(二)

文章目录一、字符串的替换二、字符串比较一、字符串的替换 格式&#xff1a; 字符串.replace(旧字符串&#xff0c;新字符串) 字符串.replaceFirst(旧字符串&#xff0c;新字符串) 替换第一个字符 字符串.replaceAll(旧字符串&#xff0c;新字符串) 替换所有字符 public clas…