字符串相关题目


# 罗马数字转整数

See More

罗马数字包含以下七种字符: I, V, X, L,C,D  和  M。

字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, 罗马数字 2 写做  II ,即为两个并列的 1 。12 写做  XII ,即为  X + II 。 27 写做   XXVII, 即为  XX + V + II 。

通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做  IIII,而是  IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为  IX。这个特殊的规则只适用于以下六种情况:

I  可以放在  V (5) 和  X (10) 的左边,来表示 4 和 9。 X  可以放在  L (50) 和  C (100) 的左边,来表示 40 和  90。  C  可以放在  D (500) 和  M (1000) 的左边,来表示  400 和  900。 给定一个罗马数字,将其转换成整数。

示例  1:

输入: s = "III" 输出: 3

示例  2:

输入: s = "IV" 输出: 4

示例  3:

输入: s = "IX" 输出: 9

示例  4:

输入: s = "LVIII" 输出: 58 解释: L = 50, V= 5, III = 3.

示例  5:

输入: s = "MCMXCIV" 输出: 1994 解释: M = 1000, CM = 900, XC = 90, IV = 4.

# 解答

/**
 * @param {string} s
 * @return {number}
 */
var romanToInt = function (s) {
  // 首先建立罗马字符对应的数值映射
  let map = new Map()
  map.set('I', 1)
  map.set('V', 5)
  map.set('X', 10)
  map.set('L', 50)
  map.set('C', 100)
  map.set('D', 500)
  map.set('M', 1000)

  let len = s.length
  let ans = 0
  // 遍历给定的字符串
  for (let i = 0; i < len; i++) {
    // 获取当前索引的罗马数字对应的值
    let value = map.get(s[i])
    // 如果当前罗马字符对应的值小于下一个位置上罗马字符对应的值,就代表要减去当前值
    // 为了防止索引越界,需要判断当前索引是否是在[0, n-1] 范围内
    if (i < len - 1 && value < map.get(s[i + 1])) {
      ans -= value
    } else {
      ans += value
    }
  }
  return ans
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

# 最长公共前缀

See More

编写一个函数来查找字符串数组中的最长公共前缀。

如果不存在公共前缀,返回空字符串 ""。

示例 1:

输入:strs = ["flower","flow","flight"] 输出:"fl" 示例 2:

输入:strs = ["dog","racecar","car"] 输出:"" 解释:输入不存在公共前缀。

# 解答

var longestCommonPrefix = function (strs) {
  // 以第一个字符串为基准
  let ans = strs[0]
  // 依次比较剩余的每一个字符串
  for (let i = 1; i < strs.length; i++) {
    // 从字符串的第0个位置开始依次比较
    let j = 0
    // 内层循环最多比较两个字符的长度的最小值次
    for (; j < strs[i].length && j < ans.length; j++) {
      // 只要有一个字符不相等,就跳出循环
      if (ans[j] !== strs[i][j]) break
    }
    // 改变基准的值
    ans = ans.subStr(0, j)
    // 如果基准值已经是空串了,则直接返回,没必要再继续对比
    if (ans === '') return ''
  }
  return ans
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

# 括号匹配

# 解答

/**
 * @param {string} s
 * @return {boolean}
 */
var isValid = function (s) {
  // 存储括号映射
  let map = new Map([
    ['(', ')'],
    ['[', ']'],
    ['{', '}'],
  ])

  let stack = []
  for (let i = 0; i < s.length; i++) {
    // 利用栈来存储左括号
    if (['(', '[', '{'].includes(s[i])) {
      stack.push(s[i])
    } else {
      // 遇到右括号就从栈中弹出栈顶元素进行匹配测试
      let c = stack.pop()
      // 不匹配则直接返回false
      if (map.get(c) !== s[i]) return false
    }
  }
  // 如果都匹配成功,栈最终应该是空的
  return !stack.length
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

# 实现  strStr()  函数 - 字符串匹配

See More

给你两个字符串  haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始)。如果不存在,则返回   -1 。

说明:

当  needle  是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。

对于本题而言,当  needle  是空字符串时我们应当返回 0 。这与 C 语言的  strstr()  以及 Java 的  indexOf()  定义相符。

示例 1:

输入:haystack = "hello", needle = "ll" 输出:2

示例 2:

输入:haystack = "aaaaa", needle = "bba" 输出:-1

示例 3:

输入:haystack = "", needle = "" 输出:0

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/implement-strstr

# 解答

  • 暴力解法
/**
 * @param {string} haystack
 * @param {string} needle
 * @return {number}
 */
var strStr = function (haystack, needle) {
  if (needle == '') return 0
  let start = needle[0]
  let hlen = haystack.length
  let nlen = needle.length

  for (let i = 0; i < hlen; i++) {
    // 如果第一个字符匹配成功,则继续比较子串中的其它字符
    if (haystack[i] === start) {
      // 是否匹配成功的标记
      let flag = true
      // 遍历子串
      for (let j = 1; j < nlen; j++) {
        // 有一个字符匹配失败就跳出内部循环,并继续外层循环
        if (haystack[i + j] !== needle[j]) {
          flag = false
          break
        }
      }
      if (flag) return i
    }
  }
  return -1
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Last Updated: 10/21/2024, 4:15:17 PM