当前位置: 首页 > news >正文

【算法|字符串、哈希表】验证回文串、螺旋塔、同构字符串、单词规律

目录

一、验证回文串

题目思路

解法一:

复杂度:

解法二:

复杂度:

二、螺旋塔

三、同构字符串

 四、单词规律


一、验证回文串

题目思路

该题是字符串相关,要求是移除给定字符串中的非字母字符和非数字字符,将大写字母字符转化为小写字母字符,在判断该字符串是否是回文串,下面有两种解法:

解法一:

定义一个string对象用于存储移除给定字符串中的非字母非数字,在对该string对象利用双指针进行判断。

复杂度:

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

class Solution {
public:bool isPalindrome(string s) {string str;int size = s.size();for(int i = 0;i < size;++i){if(s[i] >= 65 && s[i] <= 90){s[i] = s[i] + 32;}if(s[i] >= 97 && s[i] <= 122 || s[i] >= 48 && s[i] <= 57)//只将小写字母和数字字符push_back到str中str.push_back(s[i]);}int left = 0,right = str.size()-1;while(left < right){if(str[left] != str[right])return false;++left;--right;}return true;}
};

解法二:

对其对解法一的空间复杂度进行优化,不用定义string对象,直接在给定字符串上进行操作。

复杂度:

时间复杂度:O(n)    空间复杂度:O(1)

class Solution {
public:bool isPalindrome(string s) {int left = 0,right = s.size()-1;for(auto& ch:s) //将s中的大写字母转化为小写字母{if(ch >= 65 && ch <= 90)ch += 32;}while(left < right){while(left < right){if(s[left] >= 97 && s[left] <= 122 || s[left] >= 48 && s[left] <= 57)//这里数字字符'0'到'9'的ASCII范围是[48,90]break;else++left;}while(left < right){if(s[right] >= 97 && s[right] <= 122 || s[right] >= 48 && s[right] <= 57)break;else--right;}if(s[left++] != s[right--])return false;}return true;}
};

二、螺旋塔

给定一个字符串s和一个整数n,需要按照特定的规则构建并输出一个螺旋塔形状的字符串序列。

这个字符串仅由小写英文字母组成,它是构建螺旋塔的基础元素。而整数n则决定了螺旋塔的层数。

螺旋塔的构建规则如下:

螺旋塔的构建规则如下:

1.第一层是原始给定的字符串。

2.从第二层开始,每一层都是将上一层字符串的第一个字符移到末尾而形成的新字符串。

例如,对于字符串"abcd":

第一层为"abcd"。

第二层,将第一层的第一个字符a移到末尾,得到"bcda"。

第三层,将第二层的第一个字符b移到末尾,得到"cdab"。

第四层,将第三层的第一个字符c移到末尾,得到"dabc"。

要求:

输入:第一行输入一个字符串s,它代表了构建螺旋塔的初始元素。第二行输入一个整数n,它确定了你要构建的螺旋塔的层数。

输出:输出螺旋塔的前n层字符串,每层占一行。

#include <iostream>
#include <string>
#include <vector>
using namespace std;void func(vector<string>& vv, int n)
{string s = vv[0];int index = 0;while (--n){string tmp = vv[index++];string::iterator it = tmp.begin();char ch = *it;tmp.erase(it);tmp.push_back(ch);vv.push_back(tmp);}for (const auto& e : vv){cout << e << endl;}
}
int main()
{string str;int n = 0;cin >> str;cin >> n;vector<string> vv;vv.push_back(str);func(vv, n);return 0;
}

三、同构字符串

class Solution {
public:bool isIsomorphic(string s, string t) {unordered_map<char,char> hashtable_1;unordered_map<char,char> hashtable_2;int size = s.size();for(int i = 0;i < size;++i){int ch_1 = s[i];int ch_2 = t[i];if(hashtable_1.count(ch_1) && hashtable_1[ch_1] != ch_2)return false;if(hashtable_2.count(ch_2) && hashtable_2[ch_2] != ch_1)return false;hashtable_1[ch_1] = ch_2;hashtable_2[ch_2] = ch_1;}return true;}
};

 四、单词规律

 

class Solution {
public:bool wordPattern(string pattern, string s) {vector<string> str;stringstream iss(s); //直接截取字符串的函数string word;while(iss>>word) str.push_back(word); //把字符串放入if(str.size()!=pattern.size()) return false; //判断是不是满射unordered_map<char,string>pw; //判断是不是单射unordered_map<string,char>wp; //判断是不是映射for(int i = 0;i<pattern.size();i++){auto a = pattern[i];auto b = str[i];if(pw.count(a)&&pw[a]!=b) return false; //如果存在该字母对应的字符串不一致,则返回falsepw[a] = b; //存入哈希表if(wp.count(b)&&wp[b]!=a) return false; //如果存在该字符串对应的单词有多个(不一致) ,返回falsewp[b] = a; //存入哈希表}return true;}
};


http://www.mrgr.cn/news/68778.html

相关文章:

  • 24/11/7 算法笔记 PCA主成分分析
  • 高防IP能够防御哪些网络安全问题呢?
  • java 中List 的使用
  • Python学习大纲总结及注意事项
  • 线性代数(第一章:行列式)
  • 支持高性能结构化数据提取的 Embedding 模型——NuExtract-v1.5
  • 跟我学C++中级篇——生产中如何调试程序
  • 深度学习:微调(Fine-tuning)详解
  • MySQ怎么使用语法介绍(详细)
  • 深失速现象
  • 穿销程序之如何写停止程序
  • Vue3入门介绍及快速上手
  • 【傻呱呱】phpMyAdmin怎样给特定用户授权特定数据库权限?
  • 迅捷pdf转换器pk这9款,哪款是你的菜??
  • 盘点2024年10款视频剪辑,哪款值得pick!!
  • 数仓工具—Hive语法之窗口函数窗口范围/边界 range between和rows between
  • 面试官说:不懂Python装饰器的人直接Pass!!
  • 【vue2.0入门】vue单文件组件
  • 多线程案例---阻塞队列
  • 国内 ChatGPT中文版镜像网站整理合集(2024/11/08)
  • idea 基础简单应用(java)
  • Android Glide动态apply centerCropTransform(),transition withCrossFade动画,Kotlin
  • ubuntu中apt-get的默认安装路径。安装、卸载以及查看的方法总结
  • 【linux学习指南】磁盘分区挂载到目录,形成文件系统挂载点
  • 基于地铁刷卡数据分析与可视化——以杭州市为例(二)
  • 2.索引:深入解析 B+ 树:原理、MySQL 应用及与其他数据结构的对比