【每日挠头算法题(1)】——旋转字符串|亲密字符串

这篇具有很好参考价值的文章主要介绍了【每日挠头算法题(1)】——旋转字符串|亲密字符串。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


一、旋转字符串

点我直达终点~

【每日挠头算法题(1)】——旋转字符串|亲密字符串

思路1

前提:如果s串和goal串长度不等,则goal串不可能是s串旋转得来,直接返回false;

通过观察,可以发现每旋转一次,第一个字符就会出现在最后一个字符的位置处,其余字符均往前挪动一个位置。

所以我们首先将第一个字符保存,然后挪动其他字符,再将保存的字符放到最后。

其次判断s和goal是否相等,如果不等,则继续按照上述方式旋转

注意:如果旋转s的长度次后,与goal仍然不想等,返回false

代码:

class Solution {
public:
    bool rotateString(string s, string goal) 
    {
    	if(s.size()!=goal.size())
    		return false;
    		
        for(int j = 0 ; j <s.size();++j)
        {
           char ch = s[0];
                //旋转一遍
            for(int i = 1;i <s.size();++i)
            {
                s[i-1] = s[i];
            }
            s[s.size()-1] = ch;
            if(s == goal)
            {
                return true;
            }
        }

        //如果旋转完s.size()遍,还不是true,那就false
        return false;
    }
};

时间复杂度:O(N^2) 空间复杂度:O(1)(原地旋转)

思路2

前提:如果s串和goal串长度不等,则goal串不可能是s串旋转得来,直接返回false;

一个巧妙的解法:运用如果goal串由s串旋转得来,那么goal串一定是s+s串的子串。
只需要判断goal字符串是否为s+s串的子串即可。

class Solution 
{
public:
    bool rotateString(string s, string goal)
    {
        string ss = s+s;
        if(s.size() == goal.size() && ss.find(goal) != string::npos)
            return true;
        return false;
    }
};

时间复杂度:O(N) 空间复杂度O(N)

二、亲密字符串

点我直达终点~
【每日挠头算法题(1)】——旋转字符串|亲密字符串

思路

前提:如果s串和goal串长度不等,则goal串不可能是s串旋转得来,直接返回false;

对于这道题,首先遍历一遍s串,一边遍历一边与goal字符串进行对比,如果对应下标的goal串的字符和s串的对应下标的字符不相等,则记录不等的字符和下标。(s串和goal串一定只有两个不相等的字符)

找到后,如果pos1下标和pos2下标相同,说明s串和goal串一定相等。
然而这里存在两种情况,如题目描述:
情况1:ab和ab
情况2:aa和aa
此时我们不需要分情况讨论,只需要找到s字符串的任意一个字符如果出现两次及以上,则说明交换s字符串的任意两个相同的字符一定与goal字符串相等。
比如: aabab 和aabab,s字符串中的a出现了三次,b出现了两次,
那么无论怎么交换其中的a或者b,s字符串始终和goal字符串相等。

如果字符串pos1下标和pos2下标不同,则交换对应的pos1和pos2的字符,再判断是否与goal串相等即可。

详细请看代码:

class Solution {
public:
    bool buddyStrings(string s, string goal) 
    {   
        //1.长度不等,必然不是亲密字符串
        if(s.size()!=goal.size())
            return false;

        char arr[2];
        //找第一个不相同的字符,并记录下标
        int i = 0;
        int pos1 = 0,pos2 = 0;
        for(; i<s.size();++i)
        {
            if(s[i]!=goal[i])
            {
                arr[0] = s[i];
                pos1 = i;
                break;
            }
        }

        //找第二个不相同的字符
        for(i+=1; i<s.size();++i)
        {
            if(s[i]!=goal[i])
            {
                arr[1] = s[i];
                pos2 = i;
                break;
            }
        }
        //  如果pos1 == pos2,说明s和goal是完全相等的两个串
        //此时有两种情况,如果s中有两个位置交换后还是原来的s,此时s和goal相等。
        //但不管是哪种情况,我们都只需要找出任意一个字符出现2次及以上就可以知道是亲密字符串
        if(pos1 == pos2)
        {
            vector<int> count(26);
            for(int i = 0;i<s.size();++i)
            {
                count[s[i] - 'a']++;
                if(count[s[i] - 'a']>=2)
                    return true;
            }
            return false;
        }

        //此种情况不是s串和goal串相等,那么正常交换两个字符的位置然后判断是否与goal相等即可。
        else
        {
            swap(s[pos1],s[pos2]);
            if(s == goal)
                return true;

             return false;
        }
    }
};

时间复杂度:O(N); 空间复杂度O(1) 只消耗常量个空间,即26


总结

通过这两道题,学习到了旋转字符串的一般规律是转化为找子串的问题;
而亲密字符串的本质就是分情况讨论

情况1:如果s!=goal
情况2:如果s==goal

的分别处理方式。文章来源地址https://www.toymoban.com/news/detail-477625.html

到了这里,关于【每日挠头算法题(1)】——旋转字符串|亲密字符串的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【每日算法】【205. 同构字符串】

    ☀️博客主页:CSDN博客主页 💨本文由 我是小狼君 原创,首发于 CSDN💢 🔥学习专栏推荐:面试汇总 ❗️游戏框架专栏推荐:游戏实用框架专栏 ⛅️点赞 👍 收藏 ⭐留言 📝,如有错误请指正 📆 未来很长,值得我们全力奔赴更美好的生活✨ 老规矩,先介绍一下 Unity 的科

    2024年02月11日
    浏览(32)
  • 每日OJ题_算法_滑动窗口⑥_力扣438. 找到字符串中所有字母异位词

    目录 力扣438. 找到字符串中所有字母异位词 解析及代码1 解析及代码2 438. 找到字符串中所有字母异位词 - 力扣(LeetCode) 难度 中等 给定两个字符串  s  和  p ,找到  s   中所有  p   的  异位词  的子串,返回这些子串的起始索引。不考虑答案输出的顺序。 异位词  指由

    2024年01月24日
    浏览(34)
  • 算法学习——LeetCode力扣补充篇11(64. 最小路径和、48. 旋转图像 、169. 多数元素、394. 字符串解码、240. 搜索二维矩阵 II )

    64. 最小路径和 - 力扣(LeetCode) 描述 给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。 说明:每次只能向下或者向右移动一步。 示例 示例 1: 输入:grid = [[1,3,1],[1,5,1],[4,2,1]] 输出:7 解释:因为路径 1→3→1→

    2024年04月23日
    浏览(32)
  • 判断字符串旋转

    写一个函数,判断一个字符串是否为另一个字符串旋转后的字符串。 这道题主要有两个思路:第一,利用字符串旋转(之前的博客)这种方法对每旋转一次后的字符串进行判断;第二,利用库函数,这种方法未必比第一种效率高,但是这种方法写起来很快。这篇博客重点介绍

    2024年02月10日
    浏览(23)
  • ( 字符串) 205. 同构字符串 ——【Leetcode每日一题】

    难度:简单 给定两个字符串 s 和 t ,判断它们是否是同构的。 如果 s 中的字符可以按某种映射关系替换得到 t ,那么这两个字符串是同构的。 每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同字符不能映射到同一个字符上,相同字符只能映射到同一个

    2024年02月02日
    浏览(34)
  • 找凶手,定名次,字符串旋转,杨氏矩阵

    1.找凶手问题: //题目名称: //猜凶手 //题目内容: //日本某地发生了一件谋杀案,警察通过排查确定凶手必为4个嫌疑犯的一个。 //以下为4个嫌疑犯的供词: //A说:不是我 //B说:是C //C说:是D //D说:C在胡说 //已知3个人说的是真话,1个人说的是假话。 //请根据这些信息,写

    2023年04月23日
    浏览(22)
  • 判断一个字符串是否为另一个字符串旋转之后的字符串 (arr1是arr2右旋得到)

    问题: 1.判断函数传参时忘记给arr2加[] 2.把if放在for之外,导致判断不出,程序报错

    2024年02月16日
    浏览(29)
  • 【C语言练习】字符串旋转你会嘛?

    实现一个函数,可以左旋字符串中的k个字符。例如: ABCD左旋一个字符得到BCDA ABCD左旋两个字符得到CDAB  要左旋 k 个字符,我们首先应该考虑左旋 1 1 1 个字符怎么做。左旋一个字符分为以下的三步: 取出字符串中最左边的一个字符 将字符串中剩下的字符按从左到右的顺序

    2024年02月10日
    浏览(26)
  • (字符串 ) 459. 重复的子字符串——【Leetcode每日一题】

    难度:简单 给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。 示例 1: 输入: s = “abab” 输出: true 解释: 可由子串 “ab” 重复两次构成。 示例 2: 输入: s = “aba” 输出: false 示例 3: 输入: s = “abcabcabcabc” 输出: true 解释: 可由子串 “abc” 重复四次构

    2024年02月07日
    浏览(33)
  • 每日一题——字符串变形

    题目 对于一个长度为 n 字符串,我们需要对它做一些变形。 首先这个字符串中包含着一些空格,就像\\\"Hello World\\\"一样,然后我们要做的是把这个字符串中由空格隔开的单词反序,同时反转每个字符的大小写。 比如\\\"Hello World\\\"变形后就变成了\\\"wORLD hELLO\\\"。 需要考虑字符串结尾是空

    2024年02月13日
    浏览(24)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包