mirror of
https://github.com/halfrost/LeetCode-Go.git
synced 2025-07-05 00:25:22 +08:00
Add solution 1268
This commit is contained in:
@ -0,0 +1,22 @@
|
||||
package leetcode
|
||||
|
||||
import (
|
||||
"sort"
|
||||
)
|
||||
|
||||
func suggestedProducts(products []string, searchWord string) [][]string {
|
||||
sort.Strings(products)
|
||||
searchWordBytes, result := []byte(searchWord), make([][]string, 0, len(searchWord))
|
||||
for i := 1; i <= len(searchWord); i++ {
|
||||
searchWordBytes[i-1]++
|
||||
products = products[:sort.SearchStrings(products, string(searchWordBytes[:i]))]
|
||||
searchWordBytes[i-1]--
|
||||
products = products[sort.SearchStrings(products, searchWord[:i]):]
|
||||
if len(products) > 3 {
|
||||
result = append(result, products[:3])
|
||||
} else {
|
||||
result = append(result, products)
|
||||
}
|
||||
}
|
||||
return result
|
||||
}
|
@ -0,0 +1,70 @@
|
||||
package leetcode
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"testing"
|
||||
)
|
||||
|
||||
type question1268 struct {
|
||||
para1268
|
||||
ans1268
|
||||
}
|
||||
|
||||
// para 是参数
|
||||
// one 代表第一个参数
|
||||
type para1268 struct {
|
||||
products []string
|
||||
searchWord string
|
||||
}
|
||||
|
||||
// ans 是答案
|
||||
// one 代表第一个答案
|
||||
type ans1268 struct {
|
||||
one [][]string
|
||||
}
|
||||
|
||||
func Test_Problem1268(t *testing.T) {
|
||||
|
||||
qs := []question1268{
|
||||
|
||||
{
|
||||
para1268{[]string{"bags", "baggage", "banner", "box", "cloths"}, "bags"},
|
||||
ans1268{[][]string{
|
||||
{"baggage", "bags", "banner"}, {"baggage", "bags", "banner"}, {"baggage", "bags"}, {"bags"},
|
||||
}},
|
||||
},
|
||||
|
||||
{
|
||||
para1268{[]string{"mobile", "mouse", "moneypot", "monitor", "mousepad"}, "mouse"},
|
||||
ans1268{[][]string{
|
||||
{"mobile", "moneypot", "monitor"},
|
||||
{"mobile", "moneypot", "monitor"},
|
||||
{"mouse", "mousepad"},
|
||||
{"mouse", "mousepad"},
|
||||
{"mouse", "mousepad"},
|
||||
}},
|
||||
},
|
||||
|
||||
{
|
||||
para1268{[]string{"havana"}, "havana"},
|
||||
ans1268{[][]string{
|
||||
{"havana"}, {"havana"}, {"havana"}, {"havana"}, {"havana"}, {"havana"},
|
||||
}},
|
||||
},
|
||||
|
||||
{
|
||||
para1268{[]string{"havana"}, "tatiana"},
|
||||
ans1268{[][]string{
|
||||
{}, {}, {}, {}, {}, {}, {},
|
||||
}},
|
||||
},
|
||||
}
|
||||
|
||||
fmt.Printf("------------------------Leetcode Problem 1268------------------------\n")
|
||||
|
||||
for _, q := range qs {
|
||||
_, p := q.ans1268, q.para1268
|
||||
fmt.Printf("【input】:%v 【output】:%v\n", p, suggestedProducts(p.products, p.searchWord))
|
||||
}
|
||||
fmt.Printf("\n\n\n")
|
||||
}
|
89
leetcode/1268.Search-Suggestions-System/README.md
Normal file
89
leetcode/1268.Search-Suggestions-System/README.md
Normal file
@ -0,0 +1,89 @@
|
||||
# [1268. Search Suggestions System](https://leetcode.com/problems/search-suggestions-system/)
|
||||
|
||||
## 题目
|
||||
|
||||
Given an array of strings `products` and a string `searchWord`. We want to design a system that suggests at most three product names from `products` after each character of `searchWord` is typed. Suggested products should have common prefix with the searchWord. If there are more than three products with a common prefix return the three lexicographically minimums products.
|
||||
|
||||
Return *list of lists* of the suggested `products` after each character of `searchWord` is typed.
|
||||
|
||||
**Example 1:**
|
||||
|
||||
```
|
||||
Input: products = ["mobile","mouse","moneypot","monitor","mousepad"], searchWord = "mouse"
|
||||
Output: [
|
||||
["mobile","moneypot","monitor"],
|
||||
["mobile","moneypot","monitor"],
|
||||
["mouse","mousepad"],
|
||||
["mouse","mousepad"],
|
||||
["mouse","mousepad"]
|
||||
]
|
||||
Explanation: products sorted lexicographically = ["mobile","moneypot","monitor","mouse","mousepad"]
|
||||
After typing m and mo all products match and we show user ["mobile","moneypot","monitor"]
|
||||
After typing mou, mous and mouse the system suggests ["mouse","mousepad"]
|
||||
|
||||
```
|
||||
|
||||
**Example 2:**
|
||||
|
||||
```
|
||||
Input: products = ["havana"], searchWord = "havana"
|
||||
Output: [["havana"],["havana"],["havana"],["havana"],["havana"],["havana"]]
|
||||
```
|
||||
|
||||
**Example 3:**
|
||||
|
||||
```
|
||||
Input: products = ["bags","baggage","banner","box","cloths"], searchWord = "bags"
|
||||
Output: [["baggage","bags","banner"],["baggage","bags","banner"],["baggage","bags"],["bags"]]
|
||||
```
|
||||
|
||||
**Example 4:**
|
||||
|
||||
```
|
||||
Input: products = ["havana"], searchWord = "tatiana"
|
||||
Output: [[],[],[],[],[],[],[]]
|
||||
```
|
||||
|
||||
**Constraints:**
|
||||
|
||||
- `1 <= products.length <= 1000`
|
||||
- There are no repeated elements in `products`.
|
||||
- `1 <= Σ products[i].length <= 2 * 10^4`
|
||||
- All characters of `products[i]` are lower-case English letters.
|
||||
- `1 <= searchWord.length <= 1000`
|
||||
- All characters of `searchWord` are lower-case English letters.
|
||||
|
||||
## 题目大意
|
||||
|
||||
给你一个产品数组 products 和一个字符串 searchWord ,products 数组中每个产品都是一个字符串。请你设计一个推荐系统,在依次输入单词 searchWord 的每一个字母后,推荐 products 数组中前缀与 searchWord 相同的最多三个产品。如果前缀相同的可推荐产品超过三个,请按字典序返回最小的三个。请你以二维列表的形式,返回在输入 searchWord 每个字母后相应的推荐产品的列表。
|
||||
|
||||
## 解题思路
|
||||
|
||||
- 由于题目要求返回的答案要按照字典序输出,所以先排序。有序字符串又满足了二分搜索的条件,于是可以用二分搜索。sort.SearchStrings 返回的是满足搜索条件的第一个起始下标。末尾不满足条件的字符串要切掉。所以要搜 2 次,第一次二分搜索先将不满足目标串前缀的字符串筛掉。第二次二分搜索再搜索出最终满足题意的字符串。
|
||||
|
||||
## 代码
|
||||
|
||||
```go
|
||||
package leetcode
|
||||
|
||||
import (
|
||||
"sort"
|
||||
)
|
||||
|
||||
func suggestedProducts(products []string, searchWord string) [][]string {
|
||||
sort.Strings(products)
|
||||
searchWordBytes, result := []byte(searchWord), make([][]string, 0, len(searchWord))
|
||||
for i := 1; i <= len(searchWord); i++ {
|
||||
searchWordBytes[i-1]++
|
||||
products = products[:sort.SearchStrings(products, string(searchWordBytes[:i]))]
|
||||
searchWordBytes[i-1]--
|
||||
products = products[sort.SearchStrings(products, searchWord[:i]):]
|
||||
if len(products) > 3 {
|
||||
result = append(result, products[:3])
|
||||
} else {
|
||||
result = append(result, products)
|
||||
}
|
||||
}
|
||||
return result
|
||||
}
|
||||
```
|
Reference in New Issue
Block a user