题目描述
给出两个字符串,第一个字符串为26个字符,字母的值为他在该字符串的顺序.
将第二个字符串中的字符两两相减,取绝对值,为该字符串的值.
样例
5
abcdefghijklmnopqrstuvwxyz
hello
abcdefghijklmnopqrstuvwxyz
i
abcdefghijklmnopqrstuvwxyz
codeforces
qwertyuiopasdfghjklzxcvbnm
qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq
qwertyuiopasdfghjklzxcvbnm
abacaba
13
0
68
0
74
思路:使用map
- 获取两个字符串
- 声明一个
map<char, int>
,char
为字符,int
为该字符的值 - 遍历第一个字符串,将字符串的字符及值添加到
mp
中,mp[str[i + 1] ] = i + 1;
- 声明一个记录答案的变量
- 遍历第二个字符串(注意范围),将两两字符相减的绝对值加到答案变量中
res += abs(mp[str[i]] - mp[str[i + 1]]);
- 输出答案
C++
代码
#include <bits/stdc++.h>
#include <map>
using namespace std;
int main() {
int _t;
cin >> _t;
getchar();
while ( _t -- ) {
string q;
map<char, int> mp;
string str;
getline(cin, q);
getline(cin, str);
for ( int i = 0; i < q.size(); ++ i ) {
mp[q[i]] = i + 1;
}
int res = 0;
for ( int i = 0; i < str.size() - 1; ++ i ) {
res += abs(mp[str[i]] - mp[str[i + 1]]);
}
cout << res << '\n';
}
return 0;
}
思路:暴力查找
- 获取两个字符串
- 声明一个记录答案的变量
- 遍历第二个字符串(注意范围)
- 记录
i
和i+1
的字符 - 遍历第一个字符串
- 将两个字符在第一个字符串的
下标+1
记录下来 - 将两个字符相减的绝对值加到答案变量中
res += abs(aa - bb);
- 记录
- 输出答案
C++
代码
#include <bits/stdc++.h>
#include <string>
using namespace std;
int main() {
int _t;
cin >> _t;
while ( _t -- ) {
string q, str;
cin >> q >> str;
int res = 0;
for ( int i = 0; i < str.size() - 1; ++ i ) {
char a = str[i], b = str[i + 1];
int aa = 0, bb = 0;
for ( int j = 0; j < q.size(); ++ j ) {
if ( q[j] == a ) aa = j + 1;
if ( q[j] == b ) bb = j + 1;
}
res += abs(aa - bb);
}
cout << res << '\n';
}
return 0;
}