135.Password - 图1

题目概述

题目详情(点我)

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”。

解题

解题方法

  • 嵌套循环

算法知识

  • 枚举法

解题思路

前提:
char[] s1 : 密码字符串的字符数组格式
char[] str1 : 随机生成字符串的数组格式
int[] S : 密码字符串中每个字符出现的个数。(i : 0-25)
int[] temp : S数组的备份,用于恢复S(使用clone方法获得)
count : 表示成功匹配到的密码字符的个数

  1. 将提供的字符串转换为字符数组s1和str1

  2. 用一个长度为26的int型数组对密码中各个字符出现的次数进行统计。

  3. 从第一个字符开始,对之后的挨个序列进行判断

    1. 如果s1中有这个字符, 则在S中将这个字符的个数减1(减了之后判断该字符个数是否小于0),同时将count+1

      1. 若减完后S中对应字符个数小于0,则表示该序列与s1不匹配,则将count重置为0, 并使用tempS进行重置, 然后直接跳到下一个字符进行判断。
    2. 如果从某个字符 (str1[i]) 开始之后的一段序列的值全部为密码字符序列中的值(即count的值 = s1中字符的个数),则代表这个就是密码,可以直接输出”YES”了
  4. 如果对整个str1遍历一遍后仍找不到与s1匹配的序列, 则表示str1中没有密码, 则输出”NO”

特殊情况: 如果随机字符串str的长度小于密码字符串s的长度, 则肯定无法匹配成功, 这个时候就直接返回”NO”

时间复杂度: 135.Password - 图2

空间复杂度:135.Password - 图3