问:
- 剑指 Offer 19. 正则表达式匹配
- 剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
- 剑指 Offer 22. 链表中倒数第k个节点
- 剑指 Offer 24. 反转链表
- 剑指 Offer 25. 合并两个排序的链表 解:
const isMatch = function(str1, str2) {
if (!str1.length) {
if (str2.length % 2 === 1) return false
for (let i = 1; i < str2.length; i += 2) {
if (str2[i] !== '*') return false
}
return true
}
const dp = initDp()
for (let i = str1.length - 1; i >= 0; i--) {
for (let j = str2.length - 2; j >=0; j--) {
if (str2[j + 1] !== '*') {
dp[i][j] = (str2[j] === str1[i] || str2[j] === '.') && dp[i + 1][j + 1]
} else {
let si = i
while (si !== str1.length && (str2[j] === str1[si] || str2[j] === '.')) {
if (dp[si][j + 2]) {
dp[i][j] = true
break
}
si++
}
if (!dp[i][j]) dp[i][j] = dp[si][j + 2]
}
}
}
return dp[0][0]
function initDp() {
const dp = []
for (let i = 0; i <= str1.length; i++) {
dp[i] = []
for (let j = 0; j <= str2.length; j++) {
if (j === str2.length) {
dp[i][j] = i === str1.length
}
}
}
dp[str1.length][str2.length -1] = false
for (let i = str2.length - 2; i >= 0; i -= 2) {
if (str2[i + 1] === '*') {
dp[str1.length][i] = true
} else {
break
}
}
for (let i = 0; i < str2.length; i++) {
if (dp[str1.length][i + 1] !== true) {
dp[str1.length][i] = false
} else {
break
}
}
for (let i = 0; i <= str1.length - 1; i++) {
if (i === str1.length - 1) {
dp[i][str2.length - 1] = str2[str2.length - 1] === '.' || str2[str2.length - 1] === str1[str1.length - 1]
} else {
dp[i][str2.length - 1] = false
}
}
return dp
}
}
const exchange = function(arr) {
let oddIdx = -1
let evenIdx = arr.length
let idx = 0
while (idx < evenIdx) {
if (arr[idx] % 2 === 0) {
[arr[idx], arr[evenIdx - 1]] = [arr[evenIdx - 1], arr[idx]];
evenIdx--
} else {
[arr[idx], arr[oddIdx + 1]] = [arr[oddIdx + 1], arr[idx]]
oddIdx++
idx++
}
}
return arr
};
const getKthFromEnd = function(head, k) {
let quick = head
let slow = head
for (let i = 0; i < k; i++) {
quick = quick.next
}
while (quick) {
slow = slow.next
quick = quick.next
}
return slow
};
const reverseList = function(head) {
let curNode = head
let pre = null
while (curNode) {
const temp = curNode.next
curNode.next = pre
pre = curNode
curNode = temp
}
return pre
};
const mergeTwoLists = function(l1, l2) {
const preHead = new ListNode(0)
let pre = preHead
while (l1 && l2) {
if (l1.val <= l2.val) {
pre.next = l1
l1 = l1.next
} else {
pre.next = l2
l2 = l2.next
}
pre = pre.next
}
pre.next = l1 ?? l2
return preHead.next
};