Add solution 1268

This commit is contained in:
YDZ
2021-06-03 21:21:21 +08:00
parent ec597e285d
commit c0191c235d
26 changed files with 925 additions and 645 deletions

View File

@ -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
}

View File

@ -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")
}

View 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
}
```