SQL代码补全功能| 豆包MarsCode AI 刷题

202 阅读4分钟

问题描述

在开发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
  • 输出:符合条件的候选词列表,按字典序排列,用逗号分隔。

算法步骤

  1. 遍历数据列表:逐个检查列表中的每个词是否以 input_str 开头。

  2. 过滤匹配项:将所有以 input_str 开头的词收集到一个结果列表中。

  3. 排序:对结果列表按字典序排序。

  4. 去重:确保结果列表中没有重复的词。

  5. 生成输出

    • 如果结果列表为空,返回 -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")
}

总结

这是一道基本的子串匹配题目,按题意一次遍历匹配子串即可。