Java&C++题解与拓展——leetcode796.旋转字符串【区分bool、BOOL,boolean、Boolean】

160 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

每日一题做题记录,参考官方和三叶的题解

题目要求

在这里插入图片描述

思路一:暴力模拟

根据题意进行直接模拟,不过不对ss进行实际的旋转,假设它旋转了ii次,则当前位值的索引为(i+j)%n(i+j) \% n,然后进行逐位比较。

可以进行一个初步筛选,就是ssgoalgoal长度不同可直接falsefalse

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;
    }
}
  • 时间复杂度:O(n2)O(n^2)
  • 空间复杂度:O(1)O(1)

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;
    }
};
  • 时间复杂度:O(n2)O(n^2)
  • 空间复杂度:O(1)O(1)

思路二:模拟+子串匹配【一行结束】

由于旋转的特性可以知道,字符串ss与自己拼接在一起包含了旋转可以得到的所有结果,所以只需检查goalgoal是否是拼接结果s+ss+s的子串即可。

注意要判断ssgoalgoal的长度,避免出现由于ss过长导致的结果异常成立。

Java

class Solution {
    public boolean rotateString(String s, String goal) {
        return s.length() == goal.length() && (s + s).contains(goal);
    }
}
  • 时间复杂度:O(n)O(n)
  • 空间复杂度:O(n)O(n)

C++

class Solution {
public:
    bool rotateString(string s, string goal) {
        return s.size() == goal.size() && (s + s).find(goal) != string::npos;
    }
};
  • 时间复杂度:O(n)O(n)
  • 空间复杂度:O(1)O(1)【这个地方是看了find函数源码的个人猜测,似乎是原地进行比较的】

突发奇想:bool和boolean

每次java和C++互改都会因为忘记修改布尔定义报个小错,就忽然想来具体了解一下两种语言中bool和boolean。

  • Java
    • 学习参考链接
    • Java中是没有bool的,但有Boolean,是booleanboolean的封装类,类似于Integrateintint
    • 在jdk1.5.0后的版本Boolean在赋值和判断上和booleanboolean可以看作是一样的,但在向列表或哈希表取值时智能用Boolean
  • C++
    • 学习参考链接
    • C++中没有boolean,仅有boolbool作为类型定义;
    • BOOL是微软定义的一个三值逻辑(TRUE/FALSE/ERROR,分别对应1/0/11/0/-1),被定义在windef.h文件里,是VC++用于解决程序在C和C++中环境的差异。定义为typedef in BOOL,可以看到其本质是个整数。

总结

简单题直接模拟很快乐,甚至可以一行解决。

感觉自己对时空复杂度的分析能力还不够,要多多学习加强。


欢迎指正与讨论!