同构字符串和二分查找


同构字符串


给定两个字符串 s 和 t ,判断它们是否是同构的。

如果 s 中的字符可以按某种映射关系替换得到 t ,那么这两个字符串是同构的。

每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同字符不能映射到同一个字符上,相同字符只能映射到同一个字符上,字符可以映射到自己本身。

示例 1:

输入:s = "egg", t = "add"
输出:true

示例 2:

输入:s = "foo", t = "bar"
输出:false

示例 3:

输入:s = "paper", t = "title"
输出:true

提示:

  • 1 <= s.length <= 5 * 104
  • t.length == s.length
  • s 和 t 由任意有效的 ASCII 字符组成

解题思路


利用map对象分别储存’s’和’t’的每一项进行互为键值的单向映射(即{‘e’=>’a’},{‘a’=>’e’),并进行循环判断’s’和’t’的当前字符是否已经被进行映射
若出现冲突(即当前下标i对应的字符s[i]所映射的值t[i]已经存在且与当前的t[i]不相同或当前下标i对应的字符t[i]所映射的值s[i]已经存在且与当前的s[i])时说明两个字符串无法构成同构,返回false
如果遍历结束没有出现冲突,则表明两个字符串是同构的,返回true


代码展示

/**
 * @param {string} s
 * @param {string} t
 * @return {boolean}
 */
var isIsomorphic = function (s, t) {
    const mapS = new Map()
    const mapT = new Map()
    for (i = 0; i < s.length; i++) {
        if (mapS.get(s[i]) && mapS.get(s[i]) != t[i] || mapT.get(t[i]) && mapT.get(t[i]) != s[i]) {
            return false
        }
        mapS.set(s[i], t[i])
        mapT.set(t[i], s[i])
    }
    return true
};

二分查找


给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target  ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。

示例 1:

输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4

示例 2:

输入: nums = [-1,0,3,5,9,12], target = 2
输出: -1
解释: 2 不存在 nums 中因此返回 -1

提示:

  • 你可以假设 nums 中的所有元素是不重复的。
  • n 将在 [1, 10000]之间。
  • nums 的每个元素都将在 [-9999, 9999]之间。

解题思路


二分法查找的过程为,先寻找中心项nums[mid],通过比对nums[mid]和target,若相等则min即为寻找的下标,如果不相等则根据大小关系将查找范围减小一半
即:

  • nums[mid] = target,则mid为寻找的下标
  • nums[mid] > target,则target只可能在nums[mid]的左侧
  • nums[mid] < target,则target只可能在nums[mid]的右侧

同时二分法的条件是查找范围不能为空,即left <= right
如果target在nums中,即可返回下标i
否则返回 -1


代码展示

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number}
 */
var search = function (nums, target) {
    let left = 0
    let right = nums.length - 1
    while (left <= right) {
        let mid = Math.floor((left + right) / 2)
        let num = nums[mid]
        if (num == target) {
            return mid
        } else if (num < target) {
            left = mid + 1
        } else {
            right = mid - 1
        }
    }
    return -1
};

文章作者: liwenka1
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 liwenka1 !
  目录