本文已参与「新人创作礼」活动,一起开启掘金创作之路。
| 每日一题做题记录,参考官方和三叶的题解 |
题目要求
思路一:暴力模拟
根据题意进行直接模拟,不过不对进行实际的旋转,假设它旋转了次,则当前位值的索引为,然后进行逐位比较。
可以进行一个初步筛选,就是与长度不同可直接。
Java
class Solution {
public boolean rotateString(String s, String goal) {
int n = s.length(), len = goal.length();
if(n != len)
return false;
for(int i = 0; i < n; i++) { // 旋转i次
boolean flag = true;
for(int j = 0; j < n; j++) { // 逐位比较
if(s.charAt((i + j) % n) != goal.charAt(j)) {
flag = false;
break;
}
}
if(flag)
return true;
}
return false;
}
}
- 时间复杂度:
- 空间复杂度:
C++
class Solution {
public:
bool rotateString(string s, string goal) {
int n = s.size(), len = goal.size();
if(n != len)
return false;
for(int i = 0; i < n; i++) { // 旋转i次
bool flag = true;
for(int j = 0; j < n; j++) { // 逐位比较
if(s[(i + j) % n] != goal[j]) {
flag = false;
break;
}
}
if(flag)
return true;
}
return false;
}
};
- 时间复杂度:
- 空间复杂度:
思路二:模拟+子串匹配【一行结束】
由于旋转的特性可以知道,字符串与自己拼接在一起包含了旋转可以得到的所有结果,所以只需检查是否是拼接结果的子串即可。
注意要判断和的长度,避免出现由于过长导致的结果异常成立。
Java
class Solution {
public boolean rotateString(String s, String goal) {
return s.length() == goal.length() && (s + s).contains(goal);
}
}
- 时间复杂度:
- 空间复杂度:
C++
class Solution {
public:
bool rotateString(string s, string goal) {
return s.size() == goal.size() && (s + s).find(goal) != string::npos;
}
};
- 时间复杂度:
- 空间复杂度:【这个地方是看了
find函数源码的个人猜测,似乎是原地进行比较的】
突发奇想:bool和boolean
每次java和C++互改都会因为忘记修改布尔定义报个小错,就忽然想来具体了解一下两种语言中bool和boolean。
- Java
- 学习参考链接
- Java中是没有bool的,但有
Boolean,是的封装类,类似于Integrate和; - 在jdk1.5.0后的版本
Boolean在赋值和判断上和可以看作是一样的,但在向列表或哈希表取值时智能用Boolean。
- C++
- 学习参考链接
- C++中没有boolean,仅有作为类型定义;
- BOOL是微软定义的一个三值逻辑(TRUE/FALSE/ERROR,分别对应),被定义在windef.h文件里,是VC++用于解决程序在C和C++中环境的差异。定义为
typedef in BOOL,可以看到其本质是个整数。
总结
简单题直接模拟很快乐,甚至可以一行解决。
感觉自己对时空复杂度的分析能力还不够,要多多学习加强。
| 欢迎指正与讨论! |