数据结构,字符串
1 字符串转换
在分析字符串相关面试题的过程中,我们往往要针对字符串当中的每一个字符进行分析和处理,甚至有时候我们得先把给定的字符串转换成字符数组之后再进行分析和处理。
由于无法直接修改字符串里的字符,所以必须先把字符串变换为数组,然后再运用这个算法。
#include <iostream>
#include <string>
using namespace std;
int main() {
string s = "algorithm";
int len = s.size();
cout<<len<<endl;
char a[10000] = {};
cout<<"way 1"<<endl;
for(int i = 0; i< len; i++) {
a[i] = s[i];
}
char t;
// cout<<a[8];
for(int i = 0;i<(len+1)/2;i++) { // (9+1)/2 = 5,(10+1)/2 = 5
t = a[i];
a[i] = a[len -1 - i];
a[len -1 - i] = t;
}
for(int i = 0;i<len;i++) {
cout<<a[i];
}
cout<<endl;
for(int i = 0; i< len; i++) {
a[i] = s[i];
}
cout<<"way 2"<<endl;
char *m = a;
char *n = a + len-1;
while( *m!=*n) {
//swap(m,n);
char t = *m;
*m = *n;
*n = t;
*m++;
*n--;
// cout<<t<<" ";
}
for(int i = 0;i<len;i++) {
cout<<a[i];
}
cout<<endl;
return 0;
}
//指针已经忘的差不多了。
是考数组,只是可以用指针
数组的优缺点
要掌握一种数据结构,就必须要懂得分析它的优点和缺点。数组的优点在于:
构建非常简单
能在 O(1) 的时间里根据数组的下标(index)查询某个元素
而数组的缺点在于:
构建时必须分配一段连续的空间
查询某个元素是否存在时需要遍历整个数组,耗费 O(n) 的时间(其中,n 是元素的个数)
删除和添加某个元素时,同样需要耗费 O(n) 的时间
所以,当你在考虑是否应当采用数组去辅助你的算法时,请务必考虑它的优缺点,看看它的缺点是否会阻碍你的算法复杂度以及空间复杂度。
例题分析
LeetCode 第 242 题:给定两个字符串 s 和 t,编写一个函数来判断 t 是否是 s 的字母异位词。
说明:你可以假设字符串只包含小写字母。
示例 1
输入: s = "anagram", t = "nagaram"
输出: true
示例 2
输入: s = "rat", t = "car"
输出: false
字母异位词,也就是两个字符串中的相同字符的数量要对应相等。例如,s 等于 “anagram”,t 等于 “nagaram”,s 和 t 就互为字母异位词。因为它们都包含有三个字符 a,一个字符 g,一个字符 m,一个字符 n,以及一个字符 r。而当 s 为 “rat”,t 为 “car”的时候,s 和 t 不互为字母异位词。
解题思路
一个重要的前提“假设两个字符串只包含小写字母”,小写字母一共也就 26 个,因此:
可以利用两个长度都为 26 的字符数组来统计每个字符串中小写字母出现的次数,然后再对比是否相等;
可以只利用一个长度为 26 的字符数组,将出现在字符串 s 里的字符个数加 1,而出现在字符串 t 里的字符个数减 1,最后判断每个小写字母的个数是否都为 0。
按上述操作,可得出结论:s 和 t 互为字母异位词。
建议:限于篇幅不对此题进行代码剖析,但是这道题非常经典,建议大家到 LeetCode 上试试。
不是考指针,也许是数组参与的辅助展示