2085. 统计出现过一次的公共字符串
给你两个字符串数组 words1 和 words2 ,请你返回在两个字符串数组中 都恰好出现一次 的字符串的数目。
示例
示例 1
输入:words1 = ["leetcode","is","amazing","as","is"], words2 = ["amazing","leetcode","is"]
输出:2
解释:
- "leetcode" 在两个数组中都恰好出现一次,计入答案。
- "amazing" 在两个数组中都恰好出现一次,计入答案。
- "is" 在两个数组中都出现过,但在 words1 中出现了 2 次,不计入答案。
- "as" 在 words1 中出现了一次,但是在 words2 中没有出现过,不计入答案。
所以,有 2 个字符串在两个数组中都恰好出现了一次。
示例 2
输入:words1 = ["b","bb","bbb"], words2 = ["a","aa","aaa"]
输出:0
解释:没有字符串在两个数组中都恰好出现一次。
示例 3
输入:words1 = ["a","ab"], words2 = ["a","a","a","ab"]
输出:1
解释:唯一在两个数组中都出现一次的字符串是 "ab" 。
提示
- 1 <= words1.length, words2.length <= 1000
- 1 <= words1[i].length, words2[j].length <= 30
- words1[i] 和 words2[j] 都只包含小写英文字母。
代码
javascript
// 2085. 统计出现过一次的公共字符串
// https://leetcode.cn/problems/count-common-words-with-one-occurrence/description/
export function countWords (words1, words2) {
const arrayToObject = (arr) => {
const res = {}
arr.forEach(element => {
res[element] = (res[element] || 0) + 1
});
return res
}
const wObj1 = arrayToObject(words1)
const wObj2 = arrayToObject(words2)
const minLength = Math.min(words1.length, words2.length)
const resArr = words1.length === minLength ? words1 : words2
let res = 0
resArr.forEach(key => {
if (wObj1[key] === 1 && wObj2[key] === 1) {
res++
}
})
return res
};
// map实现
export function countWordsMap (words1, words2) {
const arrayToMap = (arr) => {
const res = new Map()
arr.forEach(element => {
res.set(element, (res.get(element) || 0) + 1)
});
return res
}
const wMap1 = arrayToMap(words1)
const wMap2 = arrayToMap(words2)
const minLength = Math.min(words1.length, words2.length)
const resMap = words1.length === minLength ? wMap1 : wMap2
const othMap = words1.length === minLength ? wMap2 : wMap1
let res = 0
for (const [key, value] of resMap) {
if (value === 1 && othMap.get(key) === 1) {
res++
}
}
return res
};
typescript
// 2085. 统计出现过一次的公共字符串
// https://leetcode.cn/problems/count-common-words-with-one-occurrence/description/
export function countWords (words1: string[], words2: string[]): number {
interface ObjNumber {
[propName: string]: number;
}
const arrayToObject = (arr: string[]): ObjNumber => {
const res: ObjNumber = {}
arr.forEach(element => {
res[element] = (res[element] || 0) + 1
});
return res
}
const wObj1: ObjNumber = arrayToObject(words1)
const wObj2: ObjNumber = arrayToObject(words2)
const minLength = Math.min(words1.length, words2.length)
const resArr = words1.length === minLength ? words1 : words2
let res = 0
resArr.forEach(key => {
if (wObj1[key] === 1 && wObj2[key] === 1) {
res++
}
})
return res
};
// map实现
export function countWordsMap (words1: string[], words2: string[]): number {
const arrayToMap = (arr: string[]): Map<string, number> => {
const res: Map<string, number> = new Map()
arr.forEach(element => {
res.set(element, (res.get(element) || 0) + 1)
});
return res
}
const wMap1 = arrayToMap(words1)
const wMap2 = arrayToMap(words2)
const minLength = Math.min(words1.length, words2.length)
const resMap = words1.length === minLength ? wMap1 : wMap2
const othMap = words1.length === minLength ? wMap2 : wMap1
let res = 0
for (const [key, value] of resMap) {
if (value === 1 && othMap.get(key) === 1) {
res++
}
}
return res
};
测试代码
ts
import { expect, test } from 'vitest'
import { countWords, countWordsMap } from './typescript.ts'
import { countWords as countWordsJs, countWordsMap as countWordsMapJs } from './javascript.js'
const words1 = ["leetcode","is","amazing","as","is"]
const words2 = ["amazing","leetcode","is"]
const words3 = ["b","bb","bbb"]
const words4 = ["a","aa","aaa"]
const words5 = ["a","ab"]
const words6 = ["a","a","a","ab"]
test(`countWords(words1, words2) toBe 2`, () => {
expect(countWords(words1, words2)).toBe(2)
})
test(`countWordsJs(words1, words2) toBe 2`, () => {
expect(countWordsJs(words1, words2)).toBe(2)
})
test(`countWords(words3, words4) toBe 0`, () => {
expect(countWords(words3, words4)).toBe(0)
})
test(`countWordsJs(words3, words4) toBe 0`, () => {
expect(countWordsJs(words3, words4)).toBe(0)
})
test(`countWords(words5, words6) toBe 1`, () => {
expect(countWords(words5, words6)).toBe(1)
})
test(`countWordsJs(words5, words6) toBe 1`, () => {
expect(countWordsJs(words5, words6)).toBe(1)
})
test(`countWordsMap(words1, words2) toBe 2`, () => {
expect(countWordsMap(words1, words2)).toBe(2)
})
test(`countWordsMapJs(words1, words2) toBe 2`, () => {
expect(countWordsMapJs(words1, words2)).toBe(2)
})
test(`countWordsMap(words3, words4) toBe 0`, () => {
expect(countWordsMap(words3, words4)).toBe(0)
})
test(`countWordsMapJs(words3, words4) toBe 0`, () => {
expect(countWordsMapJs(words3, words4)).toBe(0)
})
test(`countWordsMap(words5, words6) toBe 1`, () => {
expect(countWordsMap(words5, words6)).toBe(1)
})
test(`countWordsMapJs(words5, words6) toBe 1`, () => {
expect(countWordsMapJs(words5, words6)).toBe(1)
})