在线编程介绍
阿里云开发者社区在线编程产品,针对广大开发者学习、实践、面试、应聘、考试认证等打造的免费在线刷题神器。题库来自笔试模拟题、算法大赛模拟题等,界面整洁明了,操作简单,为用户营造专心答题的学习环境。点击链接开始体验:https://developer.aliyun.com/coding
本文为大家介绍其中的 第135题:Password 的题目解析,具体如下:
题目描述
题目等级:容易
知识点:字符串、枚举
查看题目:Password
Tom在期末考完试以后学习了Python语言,他发现Python语言确实是简洁又强大,在他学完字符串以后,他写了一个随机生成密码的python文件。
原理是这样的,输入一个字符串s,然后系统会随机将这个s重新任意排序,然后又生成两个字符串s1和s2,并拼接起来最终生成随机密码str = s1 + s + s2。
现在Tom有一个问题要问你,每次给你两个字符串,一个是s(表示输入的字符串),一个是str(表示产生的随机字符串),问这两个字符串是否符合上述要求的原理?如果符合输出YES,否则输出NO。1<=s,str<=100
输入两个字符串,一个是s,表示输入的字符串,一个是str,表示产生的随机字符串(1<=s,str<=100)
输出内容为一行字符串,如果符合题意中的原理输出"YES",否则输出"NO"。
示例1
输入:
"abc"
"xxxcabyyy"
输出:
"YES"
解题方法: 枚举法
解题过程中用到的参数列出:
char[] s1 : 密码字符串的字符数组格式
char[] str1 : 随机生成字符串的数组格式
int[] S : 密码字符串中每个字符出现的个数。(i : 0-25)
int[] temp : S数组的备份,用于恢复S(使用clone方法获得)
count : 表示成功匹配到的密码字符的个数
计算过程:
- 将提供的字符串转换为字符数组s1和str1
- 用一个长度为26的int型数组对密码中各个字符出现的次数进行统计。
- 从第一个字符开始,对之后的挨个序列进行判断
(1)如果 s1 中有这个字符, 则在 S 中将这个字符的个数 减1 (减了之后判断该字符个数是否小于0),同时将 count+1
若减完后S中对应字符个数小于0,则表示该序列与s1 不匹配,则将count重置为0, 并使用 temp 对 S 进行重置, 然后直接跳到下一个字符进行判断。
(2)如果从某个字符 (str1[i]) 开始之后的一段序列的值全部为密码字符序列中的值(即count的值 = s1中字符的个数),则代表这个就是密码,可以直接输出"YES"了
(3)如果对整个str1遍历一遍后仍找不到与s1匹配的序列, 则表示str1中没有密码, 则输出"NO"
特殊情况: 如果随机字符串str的长度小于密码字符串s的长度, 则肯定无法匹配成功, 这个时候就直接返回"NO"
时间复杂度: O(n^2)
空间复杂度: O(n)
看完之后是不是有了想法了呢,快来练练手吧>>查看题目:Password