同构字符串
给定两个字符串 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
};