问题描述
在开发SQL编辑器时,实现自动补全功能是提高用户体验的重要一环。小C需要实现一个功能,根据用户输入的字符片段,快速从已知的SQL关键字和数据库相关名称中找到所有以该片段开头的候选词,并按字典序输出。
例如,当用户输入 s 时,编辑器需要自动提示以 s 开头的所有可能选项,如 select。如果用户输入 fr,则需要提示 from 和 from_mobile。如果在提示中只有一个选项符合,如输入 from_ 时只提示 from_mobile。
测试样例
样例1:
输入:
num = 8,data = ["select", "from", "where", "limit", "origin_log_db", "event_log_table", "user_id", "from_mobile"], input = "f"
输出:'from,from_mobile'
样例2:
输入:
num = 8,data = ["select", "from", "where", "limit", "origin_log_db", "event_log_table", "user_id", "from_mobile"], input = "wh"
输出:'where'
样例3:
输入:
num = 8,data = ["select", "from", "where", "limit", "origin_log_db", "event_log_table", "user_id", "from_mobile"], input = "z"
输出:'-1'
样例4:
输入:
num = 8,data = ["select", "from", "where", "limit", "origin_log_db", "event_log_table", "user_id", "from_mobile"], input = "origin"
输出:'origin_log_db'
问题理解
题目要求实现一个SQL编辑器的自动补全功能。具体来说,用户输入一个字符片段,系统需要从已知的SQL关键字和数据库相关名称中找到所有以该片段开头的候选词,并按字典序输出。如果只有一个候选词符合条件,则直接输出该词;如果没有符合条件的词,则输出 -1。
数据结构选择
- 输入数据:已知的SQL关键字和数据库相关名称列表
data。 - 输入字符片段:用户输入的字符片段
input_str。 - 输出:符合条件的候选词列表,按字典序排列,用逗号分隔。
算法步骤
-
遍历数据列表:逐个检查列表中的每个词是否以
input_str开头。 -
过滤匹配项:将所有以
input_str开头的词收集到一个结果列表中。 -
排序:对结果列表按字典序排序。
-
去重:确保结果列表中没有重复的词。
-
生成输出:
- 如果结果列表为空,返回
-1。 - 否则,将结果列表中的词用逗号连接成一个字符串并返回。
- 如果结果列表为空,返回
关键点
- 字符串匹配:使用字符串切片
val[:len(input_str)]来判断val是否以input_str开头。 - 排序:使用
sort()方法对结果列表进行排序。 - 去重:通过遍历结果列表并使用一个临时变量来确保结果中没有重复的词。
测试样例
题目提供了几个测试样例,可以帮助验证代码的正确性:
- 输入
"f",输出"from,from_mobile"。 - 输入
"wh",输出"where"。 - 输入
"z",输出"-1"。 - 输入
"origin",输出"origin_log_db"。
通过这些步骤,我们可以实现一个高效的自动补全功能,满足题目要求。
题解
以下为golang代码,尚未评测(未上线)
package main
import (
"fmt"
"sort"
)
func solution(num int, data []string, input string) string {
// 依次匹配即可
resultArr := make([]string, 0)
for _, val := range data {
if len(input) > len(val) {
continue
} else {
if input == val[:len(input)] {
resultArr = append(resultArr, val)
}
}
}
// 排序
sort.Slice(resultArr, func(i, j int) bool {
return resultArr[i] < resultArr[j]
})
// 去重
distinctResultArr := make([]string, 0)
sameData := ""
for _, val := range resultArr {
if sameData == val {
continue
}
sameData = val
distinctResultArr = append(distinctResultArr, val)
}
if len(resultArr) == 0 {
return "-1"
}
result := ""
for key, val := range distinctResultArr {
if key == 0 {
result += val
} else {
result += "," + val
}
}
fmt.Println(result)
return result
}
func main() {
// You can add more test cases here
testData1 := []string{"select", "from", "where", "limit", "origin_log_db", "event_log_table", "user_id", "from_mobile", "from"}
testData2 := []string{"select", "from", "where", "limit", "group", "having", "in", "index", "inner", "insert", "like", "log_db", "log_table", "user_id", "group_name", "group_id"}
fmt.Println(solution(9, testData1, "f") == "from,from_mobile")
fmt.Println(solution(16, testData2, "g") == "group,group_name,group_id")
fmt.Println(solution(16, testData2, "m") == "-1")
}
以下为由marscode转化而来的python代码,已通过评测
package main
import (
"fmt"
"sort"
)
func solution(num int, data []string, input string) string {
// 依次匹配即可
resultArr := make([]string, 0)
for _, val := range data {
if len(input) > len(val) {
continue
} else {
if input == val[:len(input)] {
resultArr = append(resultArr, val)
}
}
}
// 排序
sort.Slice(resultArr, func(i, j int) bool {
return resultArr[i] < resultArr[j]
})
// 去重
distinctResultArr := make([]string, 0)
sameData := ""
for _, val := range resultArr {
if sameData == val {
continue
}
sameData = val
distinctResultArr = append(distinctResultArr, val)
}
if len(resultArr) == 0 {
return "-1"
}
result := ""
for key, val := range distinctResultArr {
if key == 0 {
result += val
} else {
result += "," + val
}
}
fmt.Println(result)
return result
}
func main() {
// You can add more test cases here
testData1 := []string{"select", "from", "where", "limit", "origin_log_db", "event_log_table", "user_id", "from_mobile", "from"}
testData2 := []string{"select", "from", "where", "limit", "group", "having", "in", "index", "inner", "insert", "like", "log_db", "log_table", "user_id", "group_name", "group_id"}
fmt.Println(solution(9, testData1, "f") == "from,from_mobile")
fmt.Println(solution(16, testData2, "g") == "group,group_name,group_id")
fmt.Println(solution(16, testData2, "m") == "-1")
}
总结
这是一道基本的子串匹配题目,按题意一次遍历匹配子串即可。