【每日一题Day85】LC1807 替换字符串中的括号内容 | 哈希表 双指针

简介: 如果当前字符不是左括号,那么将其直接放入结果末尾;如果是左括号,那么搜索括号内的单词,然后进行替换。

替换字符串中的括号内容【LC1807】


You are given a string s that contains some bracket pairs, with each pair containing a non-empty key.


  • For example, in the string "(name)is(age)yearsold", there are two bracket pairs that contain the keys "name" and "age".


You know the values of a wide range of keys. This is represented by a 2D string array knowledge where each knowledge[i] = [keyi, valuei] indicates that key keyi has a value of valuei.


You are tasked to evaluate all of the bracket pairs. When you evaluate a bracket pair that contains some key keyi, you will:


  • Replace keyi and the bracket pair with the key’s corresponding valuei.
  • If you do not know the value of the key, you will replace keyi and the bracket pair with a question mark "?" (without the quotation marks).


Each key will appear at most once in your knowledge. There will not be any nested brackets in s.


Return the resulting string after evaluating all of the bracket pairs.


不看题目 直接看示例更快


  • 思路:


。为了快速替换,使用哈希表存储键值和对应的value值。

。如果当前字符不是左括号,那么将其直接放入结果末尾;如果是左括号,那么搜索括号内的单词,然后进行替换。

。替换规则为:如果哈希表内存在该单词,则替换为value值,不存在则替换为"?"


  • 思路


class Solution {
    public String evaluate(String s, List<List<String>> knowledge) {
        int n = s.length();
        Map<String,String> map = new HashMap<>();
        for (List<String> list : knowledge){
            map.put(list.get(0), list.get(1));
        }
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < n; i++){
            if (s.charAt(i) != '('){
                sb.append(s.charAt(i));
            }else{
                int j = i + 1;
                while(s.charAt(j) != ')'){
                    j++;
                }
                sb.append(map.getOrDefault(s.substring(i + 1, j), "?"));
                i = j;
            }
        }
        return sb.toString();
    }
}


。复杂度


  • 时间复杂度:O ( n ) ,n为字符串长度
  • 空间复杂度:O ( m ) ,m为数组的大小
目录
相关文章
C4.
|
6月前
|
存储 程序员 C语言
C语言中如何通过指针引用字符串
C语言中如何通过指针引用字符串
C4.
67 0
|
6月前
|
算法 C语言
OJ刷题:求俩个数组的交集(没学哈希表?快排双指针轻松搞定!)
OJ刷题:求俩个数组的交集(没学哈希表?快排双指针轻松搞定!)
|
6月前
【每日一题Day301】LC2337移动片段得到字符串 | 双指针 计分
【每日一题Day301】LC2337移动片段得到字符串 | 双指针 计分
48 0
|
6月前
【每日一题Day150】LC1616分割两个字符串得到回文串 | 双指针+贪心
【每日一题Day150】LC1616分割两个字符串得到回文串 | 双指针+贪心
37 0
|
6月前
|
存储
【每日一题Day132】LC23633合并相似的物品 | 哈希表 排序+双指针
【每日一题Day132】LC23633合并相似的物品 | 哈希表 排序+双指针
51 0
|
6月前
【每日一题Day117】LC1234替换子串得到平衡字符串 | 双指针
【每日一题Day117】LC1234替换子串得到平衡字符串 | 双指针
44 0
|
6月前
|
算法 C语言
通过指针引用字符串
通过指针引用字符串
61 1
|
2月前
|
存储 人工智能 C语言
C语言程序设计核心详解 第八章 指针超详细讲解_指针变量_二维数组指针_指向字符串指针
本文详细讲解了C语言中的指针,包括指针变量的定义与引用、指向数组及字符串的指针变量等。首先介绍了指针变量的基本概念和定义格式,随后通过多个示例展示了如何使用指针变量来操作普通变量、数组和字符串。文章还深入探讨了指向函数的指针变量以及指针数组的概念,并解释了空指针的意义和使用场景。通过丰富的代码示例和图形化展示,帮助读者更好地理解和掌握C语言中的指针知识。
|
6月前
DAY-2 | 哈希表、指针与区间划分:字符种数统计问题
```markdown ## 题干 [牛客网链接](https://www.nowcoder.com/practice/eb94f6a5b2ba49c6ac72d40b5ce95f50) ## 题解 1. **查表法(哈希表)**:利用数组标记出现过的 ASCII 值小于127的字符,首次出现计数,重复则忽略。 2. **指针与区间划分(回头法)**:遍历字符串,对每个字符检查其前所有字符是否重复,重复则不计数。 ## 方法总结 - 哈希表在去重问题中非常实用,可多做相关练习。 - 使用`continue`时注意避免死循环,确保循环变量会改变。 - 多回顾此类问题以巩固理解。 ```
44 2
|
6月前
|
存储 C++
C++程序中的字符串与指针
C++程序中的字符串与指针
61 2