哭了,经典卡在第三题一个小时,看了题解后真想给自己来一巴掌

题目描述:

给你两个下标从 0 开始的字符串数组 startWords 和 targetWords 。每个字符串都仅由 小写英文字母 组成。

对于 targetWords 中的每个字符串,检查是否能够从 startWords 中选出一个字符串,执行一次 转换操作 ,得到的结果与当前 targetWords 字符串相等。

转换操作 如下面两步所述:

追加 任何 不存在 于当前字符串的任一小写字母到当前字符串的末尾。
例如,如果字符串为 "abc" ,那么字母 'd'、'e' 或 'y' 都可以加到该字符串末尾,但 'a' 就不行。如果追加的是 'd' ,那么结果字符串为 "abcd" 。
重排 新字符串中的字母,可以按 任意 顺序重新排布字母。
例如,"abcd" 可以重排为 "acbd"、"bacd"、"cbda",以此类推。注意,它也可以重排为 "abcd" 自身。
找出 targetWords 中有多少字符串能够由 startWords 中的 任一 字符串执行上述转换操作获得。返回 targetWords 中这类 字符串的数目 。

注意:你仅能验证 targetWords 中的字符串是否可以由 startWords 中的某个字符串经执行操作获得。startWords 中的字符串在这一过程中 不 发生实际变更。

样例:

方法一(位运算):

class Solution {
public:int wordCount(vector<string>& startWords, vector<string>& targetWords) {set<int> sets;for (string str : startWords){int x = 0;for (char ch : str){x ^= 1 << (ch - 'a');}sets.insert(x);}int ans = 0;for (string str : targetWords){int x = 0;for (char ch : str){x ^= 1 << (ch - 'a');}for (char ch : str){int temp = x;temp ^= 1 << (ch - 'a');if (sets.count(temp)){ans++;break;}}}return ans;}
};

这个方法挺巧妙的,由于各个单词中的字母出现次数是不重复的,所以可以利用异或将每个单词转换为一个对应的二进制数,然后再将targetWords中的每个单词枚举去掉某个字母后得到的单词的二进制数,是否存在于由starWords所算出来的二进制数集合中。

方法二(哈希表)

class Solution {
public:int wordCount(vector<string>& startWords, vector<string>& targetWords) {unordered_set<string> sets;for (string str : startWords){sort(str.begin(), str.end());int hash[26] = {0};for (char ch : str){hash[ch - 'a'] = 1;}for (char ch = 'a'; ch <= 'z'; ch++){if (hash[ch - 'a'] == 0){string temp = str + ch;sort(temp.begin(), temp.end());sets.insert(temp);}}}int ans = 0;for (string str : targetWords){sort(str.begin(), str.end());if (sets.count(str)){ans++;}}return ans;}
};

就是这个方法,看得我真想给自己来一巴掌,写题时一直想着如果用排序的话,复杂度就是n * nlogn,将会超时,但是实际上是n * slogs(s为字符串的长度,最大为26),是符合时间要求的!

今天写的实在有点郁闷,第二题都比第三题难反而写出来了,字符串题目还是得多练练,每次遇到难点的字符串的题目都得卡半天,而且还有不少小技巧,例如方法一中将单词转换为二进制数的方法,如果知道这一技巧的话这道题将会更加简单。

2022.1.9 力扣-周赛-统计追加字母可以获得的单词数相关推荐

  1. LeetCode 2135. 统计追加字母可以获得的单词数

    文章目录 一.题目 1.题目描述 2.基础框架 3.原题链接 二.解题报告 1.思路分析 2.时间复杂度 3.代码详解 三.本题小知识 四.加群须知 一.题目 1.题目描述   给你两个下标从 0 开 ...

  2. 2022.1.23 力扣-周赛-基于陈述统计最多好人数

    题目描述: 游戏中存在两种角色: 好人:该角色只说真话. 坏人:该角色可能说真话,也可能说假话. 给你一个下标从 0 开始的二维整数数组 statements ,大小为 n x n ,表示 n 个玩家 ...

  3. 第 256 场力扣周赛(状态压缩+dp,二进制子序列的动规、940)

    第 256 场力扣周赛 有事没做,来看一下题 5854. 学生分数的最小差值 题目描述 给你一个 下标从 0 开始 的整数数组 nums ,其中 nums[i] 表示第 i 名学生的分数.另给你一个整 ...

  4. 第 254 场力扣周赛(KMP、贪心、快速幂、二分+多源bfs、并查集 + 时光倒流)

    第 254 场力扣周赛 稀里糊涂双眼双眼惺忪的做了三道,错了4次...还是600来名 5843. 作为子字符串出现在单词中的字符串数目 题目描述 给你一个字符串数组 patterns 和一个字符串 w ...

  5. 【力扣周赛】第342场周赛

    [力扣周赛]第342场周赛 6387:计算列车到站时间 题目描述 解题思路 6391:倍数求和 题目描述 解题思路 6390:滑动子数组的美丽值 题目描述 解题思路 6392:使数组所有元素变成1的最 ...

  6. 【力扣周赛】第345场周赛

    [力扣周赛]第345场周赛 6430: 找出转圈游戏输家 题目描述 解题思路 6431: 相邻值的按位异或 题目描述 解题思路 6433: 矩阵中移动的最大次数 题目描述 解题思路 6432: 统计完 ...

  7. 【力扣周赛】第347场周赛

    [力扣周赛]第347场周赛 6457. 移除字符串中的尾随零 题目描述 解题思路 2711. 对角线上不同值的数量差 题目描述 解题思路 6455. 使所有字符相等的最小成本 题目描述 解题思路 64 ...

  8. 【力扣周赛】第341场周赛

    [力扣周赛]第341场周赛 6376:一最多的行 题目描述 解题思路 6350:找出可整除性得分最大的整数 题目描述 解题思路 6376:一最多的行 题目描述 描述:给你一个大小为m x n的二次制作 ...

  9. 【力扣周赛】第350场周赛

    [力扣周赛]第350场周赛 2739. 总行驶距离 题目描述 解题思路 2740. 找出分区值 题目描述 解题思路 2741. 特别的排列 题目描述 解题思路 2739. 总行驶距离 题目描述 描述: ...

最新文章

  1. 笔记 | 深入理解Transformer
  2. 机器学习 —— 概率图模型(推理:连续时间模型)
  3. 《黑客秘笈——渗透测试实用指南》—第2章2.4节Web应用程序的扫描
  4. lcx源代码以及免杀的研究
  5. java 常见bug_java常见bug
  6. springboot 打包_springboot打包-体积太大怎么办
  7. selenium 问题:OSError: [WinError 6] 句柄无效
  8. HICE第四天笔记 12月8日
  9. 微信步数修改.html,把微信步数修改到小
  10. C语言,输入三个数求其平均值!
  11. shutdown关机命令 C语言 关机程序(恶搞 )
  12. 微信小程序反编译wxss文件缺失_微信小程序反编译 wxss 丢失问题
  13. 前端知识-vue-3、组件化开发
  14. 计算机房的正常温度和湿度,机房适宜的湿度和温度是多少?
  15. 简单爬虫——京东网图书爬取
  16. 【日常问题】chrome开启无痕模式,屏蔽第三方cookie
  17. nonnegative matrix factorization (NMF)的R实现
  18. 最新!2020中国高校毕业生薪资排行出炉!
  19. VB-Word添加页眉页脚
  20. 路由之间通过静态通信(+回环)

热门文章

  1. Centos7 连接wifi (PEAP)
  2. opencv直线拟合cv::fitLine()
  3. 【上传】Nginx 上传文件
  4. 智安新闻丨智安网络与“南滨路国家级文化数字产业中心”就等保云业务展开成功签署战略合作协议
  5. 如何设置lazada促销活动--Flash Sale
  6. 原创 | SpringBoot版本竟然引发这种问题,让我吐血三升!
  7. 蓝桥杯:三升排序——————Python
  8. 字符串中出现次数最多的字符
  9. 如何将河道水系CAD数据导入HEC-RAS中?详细教程!
  10. 影之刃服务器维护,影之刃无法联机到服务器怎么办 解决办法