单词游戏
难度:
标签:
题目描述
代码结果
运行时间: 96 ms, 内存: 42.2 MB
/*
* Leetcode 2868: 单词游戏
*
* 题目描述:
* 给定一个由字母和空格组成的字符串 s,返回 s 中最后一个单词的长度。
* 如果不存在最后一个单词,请返回 0。
* 一个单词被定义为仅由字母组成、不包含任何空格字符的最大子字符串。
*
* 思路:
* 1. 去掉字符串末尾的空格。
* 2. 使用 Java Stream 对字符串进行反转,找到最后一个单词。
* 3. 返回找到的单词的长度。
*/
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class Solution {
public int lengthOfLastWord(String s) {
// 去掉末尾空格
s = s.trim();
// 分割字符串并转换为列表
List<String> words = Arrays.asList(s.split(" "));
// 反转列表
Collections.reverse(words);
// 返回第一个单词的长度
return words.get(0).length();
}
}
解释
方法:
这个题解的基本思路是使用深度优先搜索(DFS)来模拟两个玩家(Alice 和 Bob)轮流从两个不同的单词列表中选择单词的游戏。玩家必须选择的单词需要字母顺序大于上一个选择的单词,并且以相邻的字母开头。解题关键是利用缓存(通过@cache装饰器)来避免重复计算相同状态下的结果,提高效率。通过递归调用`dfs`函数来判断当前玩家是否有必胜策略。如果当前玩家能选择一个单词,使得对方在下一轮没有必胜策略,则当前玩家获胜。
时间复杂度:
O(1)
空间复杂度:
O(1)
代码细节讲解
🦆
题解中提到的`字母顺序大于上一个选择的单词`是如何具体比较的?是否是比较整个字符串的字典序还是只比较首字母?
▷🦆
在函数`dfs`中,递归调用`not dfs(left[i], not flag)`返回True表示什么意思?这是如何体现当前玩家有必胜策略的?
▷🦆
题解中提到的缓存是如何优化递归性能的?能否具体解释缓存在这个问题中起到的作用和它的工作机制?
▷🦆
为什么题解选择以首字母的Ascii码偏移量来初始化`left`和`right`数组?使用这种方法有什么特别的优点吗?
▷