字符串是由零个或多个字符组成的有限序列。一般记为 s=a1a2...an。它是编程语言中表示文本的数据类型。(字符串就是字符数组)
字符串与数组有很多相似之处,比如使用 名称[下标]
来得到一个字符。然而,字符串有其鲜明的特点,即结构相对简单,但规模可能是庞大的(这是相对于普通数组来说)。
在编程语言中,字符串往往由特定字符集内有限的字符组合而成,根据其特点,对字符串的 操作 可以归结为以下几类:
- 字符串的比较、连接操作(不同编程语言实现方式有所不同);
- 涉及子串的操作,比如前缀,后缀等;
- 字符串间的匹配操作,如 KMP 算法、BM 算法等。
1. 罗马数字转整数
class Solution {
public:
int getvalue(char ch){
switch(ch){
case 'I' : return 1;
case 'V' : return 5;
case 'X' : return 10;
case 'L' : return 50;
case 'C' : return 100;
case 'D' : return 500;
case 'M' : return 1000;
}
return 0;
}
public:
int romanToInt(string s) {
//六种特殊情况是需要枚举判断的
int answer = 0;
if(s.length()==1){
answer = getvalue(s[0]);
return answer;
}
int i = 0;
while(i<s.length()-1){ //时间复杂度为O(n)
if(s[i]=='I'){
if(s[i+1]=='V'){
answer += 4;
i+=2;
}else if(s[i+1]=='X'){
answer += 9;
i+=2;
}else{
answer += 1;
i++;
}
}else if(s[i]=='X'){
if(s[i+1]=='L'){
answer += 40;
i+=2;
}else if(s[i+1]=='C'){
answer += 90;
i+=2;
}else{
answer += 10;
i++;
}
}else if(s[i]=='C'){
if(s[i+1]=='D'){
answer += 400;
i+=2;
}else if(s[i+1]=='M'){
answer += 900;
i+=2;
}else{
answer += 100;
i++;
}
}else{
answer += getvalue(s[i]);
i++;
}
}
answer += getvalue(s[i]);
return answer;
}
};
这里若使用字符串的replace操作,代码会更加简洁。
⚠️字符串之所以和能和普通数组区分开来,就是因为有特殊操作,要知道使用!编程语言是提供了string类库函数的。
2. 整数转罗马数字
class Solution {
public:
string intToRoman(int num) {
string answer = "";
int list1[] = {1000,900,500,400,100,90,50,40,10,9,5,4,1};
string list2[] = {"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};
for(int i=0;i<13;i++){
while(num>=list1[i]){ //时间复杂度取决于输入数字的大小
answer += list2[i];
num -= list1[i];
}
}
return answer;
}
};
真的是要利用好数据结构呀,对于问题的得当表示,能很大程度上减少算法的复杂度。