本文先讲述了游戏大厂员工因女友炫富被裁的事件,还提及类似“坑夫式炫富”案例,接着引入了LeetCode第139题“单词拆分”的算法题,详细介绍了题目内容和问题分析,并给出了Java和C++的代码实现。
近期,网络上一则新闻引起了广泛关注。有一位游戏大厂员工的女友,在网上发文大肆炫耀自己的未婚夫。据她所说,未婚夫在2024年的年薪成功突破了300万。在不久前她过生日的时候,未婚夫更是直接给她转了4万作为零花钱,还在广州购置了一套大平层。原本两人打算在今年十一举行婚礼,然而命运却在此处转折。该员工被同一家公司的其他员工发现了女友的炫富行为,并进行了举报,最终这名员工被公司裁掉。
事实上,这种“坑夫式炫富”的情况并非个例。早在2022年,中金交易员的妻子晒出了丈夫8.25万的月薪单,这一行为直接引发了金融圈的薪酬整顿风暴,导致全行业人均薪资缩水了20%。通常来说,互联网公司对于薪资是有保密要求的,有些公司甚至会和员工签订保密协议,明确规定薪资不能向外人透露。不过,仅仅因为女友炫富就被裁掉,很多人可能会觉得有些不可思议,想必背后还有其他深层次的原因。
--------------下面是今天的算法题--------------
接下来,让我们一起来看今天的算法题,这道题来自LeetCode的第139题:单词拆分。
问题描述
来源:LeetCode第139题,难度:中等
题目给出一个字符串 s 和一个字符串列表 wordDict 作为字典。要求判断是否可以利用字典中出现的一个或多个单词拼接出字符串 s ,如果可以则返回 true。需要注意的是,不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。
示例1:
输入: s = "leetcode", wordDict = ["leet", "code"]
输出: true
解释: 返回 true 是因为 "leetcode" 可以由 "leet" 和 "code" 拼接而成。
示例2:
输入: s = "catsandog", wordDict = ["cats", "dog", "sand", "and", "cat"]
输出: false
同时,题目还有以下限制条件:
1 <= s.length <= 300
1 <= wordDict.length <= 1000
1 <= wordDict[i].length <= 20
s 和 wordDict[i] 仅由小写英文字母组成
wordDict 中的所有字符串 互不相同
问题分析
这道题要判断能否用字典中的字符串拼接成字符串 s ,实际上就是把字符串 s 拆分成一些子串,然后判断这些子串是否都存在于字典 wordDict 中。解决这道题的方法有很多种,比如动态规划、BFS(广度优先搜索)和 DFS(深度优先搜索),这里我们先来看动态规划的解决方法。
定义 dp[i] 表示字符串的前 i 个字符经过拆分是否都存在于字典 wordDict 中。如果要求 dp[i] 的值,需要往前截取 k 个字符,判断子串 [i - k + 1,i] 是否存在于字典 wordDict 中,并且前面子串 [0,i - k] 拆分的子串也都存在于 wordDict 中,如果都满足条件,说明字符串 s 的前 i 个字符可以拆分。
例如,要判断字符串“catsan”是否可以正常拆分,我们先截取前 6 个字符,判断它们是否存在于字典中,如果不存在,就依次截取 5 个、4 个……如果存在,还需要判断剩下的字符是否可以正常拆分。
JAVA代码实现:
public boolean wordBreak(String s, List wordDict) { int len = s.length(); boolean[] dp = new boolean[len + 1]; dp[0] = true; // 空字符串,不需要字典中的字符串。 for (int i = 1; i <= len; i++) { for (int j = 0; j < i; j++) { // 把字符串分割为s[0,j - 1]和s[j,i]两部分, // 这两部分必须都存在于字典中dp[i]才会返回true。 dp[i] = dp[j] && wordDict.contains(s.substring(j, i)); if (dp[i]) { // 只要有一种方式能够拆分成功,后面就不要尝试拆分了。 break; } } } return dp[len];}
C++代码实现:
public: bool wordBreak(string s, vector& wordDict) { size_t len = s.size(); vector dp(len + 1, false); unordered_set wordSet(wordDict.begin(), wordDict.end()); dp[0] = true; // 空字符串,不需要字典中的字符串。 for (int i = 1; i <= len; i++) { for (int j = 0; j < i; j++) { // 把字符串分割为s[0,j - 1]和s[j,i]两部分, // 这两部分必须都存在于字典中dp[i]才会返回true。 if (dp[j] && wordSet.find(s.substr(j, i - j)) != wordSet.end()) { dp[i] = true; // 只要有一种方式能够拆分成功,后面就不要尝试拆分了。 break; } } } return dp[len]; }
本文先是讲述了游戏大厂员工因女友炫富被裁以及此前类似“坑夫式炫富”引发行业整顿的事件,反映了职场薪资保密的重要性。之后引入LeetCode第139题“单词拆分”算法题,详细介绍题目、分析问题并给出了Java和C++的代码实现,帮助读者理解解题思路。
原创文章,作者:购物狂魔,如若转载,请注明出处:https://www.gouwuzhinan.com/archives/42015.html