6.3 进阶之道
6.3.1 菱形
题目描述:
输入一个奇数 n,输出一个由 * 构成的 n 阶实心菱形。
输入格式:
一个奇数 n。
输出格式:
输出一个由 * 构成的 n 阶实心菱形。
具体格式参照输出样例。
输入样例:
5
输出样例:
* *** ***** *** *
在线评测环境:AcWing 727. 菱形
代码:
n = int(input()) for i in range(n): s = '' for j in range(n): t = n // 2 if abs(i - t) + abs(j - t)>t: s += str(' ') else: s += str('*') print(s)
6.3.2 字符串移位包含问题
题目描述:
对于一个字符串来说,定义一次循环移位操作为:将字符串的第一个字符移动到末尾形成新的字符串。
给定两个字符串 s1 和 s2,要求判定其中一个字符串是否是另一字符串通过若干次循环移位后的新字符串的子串。
例如 CDAA 是由 AABCD 两次移位后产生的新串 BCDAA 的子串,而 ABCD 与 ACBD 则不能通过多次移位来得到其中一个字符串是新串的子串。
输入格式:
共一行,包含两个字符串,中间由单个空格隔开。
字符串只包含字母和数字,长度不超过 30。
输出格式:
如果一个字符串是另一字符串通过若干次循环移位产生的新串的子串,则输出 true,否则输出 false。
输入样例:
AABCD CDAA
输出样例:
true
在线评测环境:AcWing 776. 字符串移位包含问题
代码:
s1, s2 = input().strip().split(" ") if len(s1) < len(s2): s1, s2 = s2, s1 s1 = s1 * 2 if(s1.find(s2) != -1): print("true") else: print("false")
6.3.3 字符串乘方
题目描述:
给定两个字符串 a 和 b,我们定义 a×b 为他们的连接。
例如,如果 a=abc 而 b=def, 则 a×b=abcdef。
如果我们将连接考虑成乘法,一个非负整数的乘方将用一种通常的方式定义:a0=''(空字符串),a(n+1)=a×(an)。
输入格式:
输入包含多组测试样例,每组测试样例占一行。
每组样例包含一个字符串 s,s 的长度不超过 100。
最后的测试样例后面将是一个点号作为一行。
输出格式:
对于每一个 s,你需要输出最大的 n,使得存在一个字符串 a,让 s=an。
输入样例:
abcd aaaa ababab .
输出样例:
1 4 3
在线评测环境:AcWing 777. 字符串乘方
代码:
while True: s = input() if s == '.': break n = len(s) for i in range (n): if n % (i + 1) == 0: sub = s[:i + 1] c = n // (i+1) sp = '' for j in range (c): sp += sub j += 1 if s == sp: print (c) break
6.3.4 字符串最大跨距
题目描述:
有三个字符串 S,S1,S2,其中,S 长度不超过 300,S1 和 S2 的长度不超过 10。
现在,我们想要检测 S1 和 S2 是否同时在 S 中出现,且 S1 位于 S2 的左边,并在 S 中互不交叉(即,S1 的右边界点在 S2 的左边界点的左侧)。
计算满足上述条件的最大跨距(即,最大间隔距离:最右边的 S2 的起始点与最左边的 S1的终止点之间的字符数目)。
如果没有满足条件的 S1 ,S2 存在,则输出 −1 。
例如,S= abcd123ab888efghij45ef67kl, S1= ab, S2= ef,其中,S1 在 S 中出现了 2 次,S2 也在 S 中出现了 2 次,最大跨距为:18。
输入格式:
输入共一行,包含三个字符串 S,S1,S2,字符串之间用逗号隔开。
数据保证三个字符串中不含空格和逗号。
输出格式:
输出一个整数,表示最大跨距。
如果没有满足条件的 S1 和 S2 存在,则输出 −1。
输入样例:
abcd123ab888efghij45ef67kl,ab,ef
输出样例:
18
在线评测环境:AcWing 778. 字符串最大跨距
代码:
s, s1, s2 = input().split(",") a = s.find(s1) b = s.rfind(s2) if(a == -1 or b == -1 or a+len(s1) >= b): print("-1") else: print(b - a - len(s1))
6.3.5 最长公共字符串后缀
题目描述:
给出若干个字符串,输出这些字符串的最长公共后缀。
输入格式:
由若干组输入组成。
每组输入的第一行是一个整数 N。
N为 0 时表示输入结束,否则后面会继续有 N 行输入,每行是一个字符串(字符串内不含空白符)。
每个字符串的长度不超过 200。
输出格式:
共一行,为 N 个字符串的最长公共后缀(可能为空)。
输入样例:
3 baba aba cba 2 aa cc 2 aa a 0
输出样例:
ba a
在线评测环境:AcWing 779. 最长公共字符串后缀
代码:
while True: n = int(input()) if n == 0: break s = [''] * 200 s_len, mlen = n, 200 ms = '' for i in range(n): s[i] = input() if mlen > len(s[i]): mlen = len(s[i]) ms = s[i] found = False for j in range(mlen): is_success = True ms2 = ms[j:] for k in range(s_len): if s[k][len(s[k]) - mlen + j:] != ms2: is_success = False if is_success: found = True print(ms2) break if not found: print('')