重排字符串数组


/*

给定一系列长度相等的字符串,请对字符串进行重排,使得相邻的2个字符串之间仅有一个字符差异,请输出重排后的结果:
如果有多个解,则输出字典序的最小的解。
如果无解,则输出字符串Impossible
注:仅对字符串进行重排,每个字符串本身不能改动

输入:
第一行为整数n,表示输入字符串的行数,范围【2,20】
接下来n行字符串,字符串均为小写字符组成,且长度相同,每个字符串长度范围为【1,15】
输出:
按行输出重排后的字符串,或字符串Impossible
样例1
输入:3
gbd
abc
abd
输出:abc
abd
gdb
解释
重排后的字符串:
abc 与后一个字符串相差一个字符c
abd 与前一个字符串相差一个字符d,与后一个字符相差一个字符a
gdb 与前一个字符串相差一个字符g

["abc","abd", "gbd"], ["gdb", "abd", "abc"] 都是可行解,字典序最小为【"abc", "abd","gbd"】

样例2
输入 3
abd
abc
abd
输出
abd
abc
abd
样例3
输入 3
abde
cccc
abde
输出Impossible


* Copyright (c) Huawei Technologies Co., Ltd. 2020-2020. All rights reserved.
* Description: 考生实现代码
* Note: 缺省代码仅供参考,可自行决定使用、修改或删除
* 只能import Go标准库
*/
package main

import (
"bufio"
"fmt"
"io"
"os"
"strings"
)

// 待实现函数,在此函数中填入答题代码
func rearrangeArray(stringInfo []string) []string {
return nil
}

func main() {
reader := bufio.NewReader(os.Stdin)
var line int
if _, err := fmt.Fscanf(reader, "%d\n", &line); err != nil {
return
}
stringInfo, err := readInputStrArrayFromNlines(reader, line)
if err != nil {
return
}

result := rearrangeArray(stringInfo)
if len(result) == 0 {
fmt.Println("Impossible")
} else {
for _, value := range result {
fmt.Println(value)
}
}

}

func readInputStrArrayFromNlines(reader *bufio.Reader, num int) ([]string, error) {
if num <= 0 {
return []string{}, nil
}
result := make([]string, 0, num)
for i := 0; i < num; i++ {
lineBuf, err := reader.ReadString('\n')
if err != nil && err != io.EOF {
return nil, err
}
lineBuf = strings.TrimRight(lineBuf, "\r\n")
lineBuf = strings.TrimSpace(lineBuf)

result = append(result, lineBuf)
}
return result, nil
}

posted @ 2022-10-05 17:18  易先讯  阅读(544)  评论(0编辑  收藏  举报