字符串的最大公因子 Go
题目:
对于字符串 S 和 T,只有在 S = T + … + T(T 与自身连接 1 次或多次)时,我们才认定 “T 能除尽 S”。
返回字符串 X,要求满足 X 能除尽 str1 且 X 能除尽 str2。
示例 1:
输入:str1 = “ABCABC”, str2 = “ABC”
输出:“ABC”
示例 2:
输入:str1 = “ABABAB”, str2 = “ABAB”
输出:“AB”
示例 3:
输入:str1 = “LEET”, str2 = “CODE”
输出:""
解题思路:
1、最大公因子的基本的组成字符是相同的
2、两个字符串如果有最大公因子,则都以最大公因子开头
PS: 如果有错误的地方,希望指正。
代码如下:
func gcdOfStrings(str1, str2 string) string {
sameArray := []int32{}
str1Map := map[int32]int32{}
if len(str1) < len(str2) {
str1, str2 = str2, str1
}
for _, word := range str1 {
str1Map[word] = word
}
for _, word := range str2 {
if _, exist := str1Map[word]; exist {
sameArray = append(sameArray, word)
}
}
var sameStr string
for _, word := range sameArray {
sameStr += string(rune(word))
}
if strings.HasPrefix(str1, sameStr) && strings.HasPrefix(str2, sameStr) {
return sameStr
}
return ""
}
测试如下:
func TestGcdOfStrings(t *testing.T) {
// case 1
if "AABC" != gcdOfStrings("AABCAABC", "AABC") {
t.Fatal("case1测试失败")
}
// case 2
if "AABC" != gcdOfStrings("AABC", "AABCAABC") {
t.Fatal("case2测试失败")
}
// case3
if "AB" != gcdOfStrings("ABABAB", "AB") {
t.Fatal("case3测试失败")
}
// case4
if "" != gcdOfStrings("HELLO", "WORLD") {
t.Fatal("case4测试失败")
}
}
测试结果:
=== RUN TestGcdOfStrings
--- PASS: TestGcdOfStrings (0.00s)
PASS