Algorithm1.0 字符串基本
[TOC]
字符串基本
数字字符串的排序 (直接用数字排序即可)
https://www.luogu.com.cn/problem/P3955
思路:首先按照长度排序,然后如果长度相等了,在直接字符串比较大小
#include <iostream>
using namespace std;
const int maxn = 1e3+9;
int n, q, l;
string s[maxn], sq;
#include <algorithm>
bool cmp(string s1, string s2) {
if (s1.length() == s2.length()) return s1 < s2;
return s1.length() < s2.length();
}
int main() {
scanf("%d%d", &n, &q);
for (int i = 1; i <= n; ++i) cin>>s[i];
sort(s+1, s+1+n, cmp);
for (int i = 1; i <= q; ++i) {
cin>>l>>sq;
int fd = 0;
for (int j = 1; j <= n; ++j) {
if (l > s[j].length()) continue;
else {
int flag = 1;
for (int k = 0; k < l; ++k)
if (sq[l-k-1] != s[j][s[j].length()-k-1]) {flag = 0;break;}
if (flag) {fd = 1;cout<<s[j]<<endl;break;}
}
}
if (fd) continue;
else puts("-1");
}
return 0;
}
结合拼接的排序
将字符串进行拼接的操作进行排序,保证按照将拼接之后的字串值最大作为顺序
https://www.luogu.com.cn/problem/P1012
题目大意:给出若干个字符串(长度不等长),要求拼接出一个字符串,这个字符串所代表的数最大。
1、单个字符串和单个字符串之间不好比较,转换成(单个字符串a+单个字符串b)与(单个字符串b+单个字符串a)的比较,这样就方便比较两个字符串拼接顺序,拼接无非就是先a后b或者先b后a,所以这样固定住了。
2、结合sort直接对string strs[maxn];
进行排序即可。封装好bool cmp()
函数。
#include <iostream>
using namespace std;
int n;
#define maxn 25
string strs[maxn];
#include <algorithm>
bool cmp(string a, string b){
return a+b > b+a;
}
int main() {
scanf("%d", &n);
for (int i = 0; i < n; ++i) cin>>strs[i];
sort(strs, strs+n, cmp);
for (int i = 0; i < n; ++i) cout<<strs[i];
return 0;
}
回文串
题目链接:valid-palindrome
C/C++ - basic
利用toupper()
、tolower()
转换大小写
bool isPalindrome(string s) {
// remove invalid char and transform to lower case
string str = "";
for(int i = 0; i < s.length(); i++)
if (s[i] <= 'Z' && s[i] >= 'A' || s[i] <= 'z' && s[i] >= 'a' || s[i] <= '9' && s[i] >= '0')
str += tolower(s[i]);
// check
int l = str.size();
for (int i = 0; i < str.length()/2; ++i)
if (str[i] != str[l-1-i])
return false;
return true;
}
C/C++ - 利用字符串函数
isalnum()
来check 当前的字符串是否是数字和字母,isalpha()
是否是字母、isdigit()
是否为数字
bool isPalindrome(string s) {
// remove invalid char and transform to lower case
string str = "";
for(int i = 0; i < s.length(); i++)
if (isalnum(s[i]))
str += tolower(s[i]);
// check
int l = str.size();
for (int i = 0; i < str.length()/2; ++i)
if (str[i] != str[l-1-i])
return false;
return true;
}
C/C++ - 利用string的倒序rbegin()、rend()
原字符串倒转,看是否等于原字符串=>string rev_str(str.rbegin(), str.rend());
string sgood_rev(sgood.rbegin(), sgood.rend());
return sgood == sgood_rev;
bool isPalindrome(string s) {
// remove invalid char and transform to lower case
string str = "";
for(int i = 0; i < s.length(); i++)
if (isalnum(s[i]))
str += tolower(s[i]);
// check
string rev_str(str.rbegin(), str.rend())
return rev_str == str;
}
Python
思路:
1、用filter(target_char, str)
来提取s中所需要的目标字符
2、然后目标字符就是str.isalnum
标准字符串中是数字和字母的一个属性中的所有元素,
3、利用lower()
来将字符串给转换成小写
4、利用s[::-1]
来倒序
bool isPalindrome(string s):
# remove invalid char and transform to lower case
s = ''.join(filter(str.isalnum, s)).lower()
# check
return s == s[::-1]