背景
vector<int>
是可以改变大小的。
int a[100]
是指定大小为100的, 而且必须的声明的时候给出大小。
今天, 做了阿里周赛的第一题, 一直超时,赛后才知道是这个原因。写了个简单的对比代码, 计算了时间, 在知道数据范围的时候, int []
来初始化, 能提高效率。
有兴趣的话, 可以自己试一下。
题目
描述
给出一个只含有小写字母的字符串的集合以及一个目标串(target),输出所有可以经过不多于 k 次操作得到目标字符串的字符串。
你可以对字符串进行一下的3种操作:
-
加入1个字母
-
删除1个字母
-
替换1个字母
0
<
=
<
=
60
0<=<=60
0<=<=60
s
u
m
(
l
e
n
(
s
)
)
<
=
2
e
5
sum(len(s)) <= 2e5
sum(len(s))<=2e5
l
e
n
(
t
a
r
g
e
t
)
<
=
1000
len(target) <= 1000
len(target)<=1000
s
u
m
(
l
e
n
(
s
)
)
∗
l
e
n
(
t
a
r
g
e
t
)
<
=
2
e
7
sum(len(s)) * len(target) <=2e7
sum(len(s))∗len(target)<=2e7
示例
样例 1:
给出字符串 ["abc","abd","abcd","adc"]
,目标字符串为 "ac"
,k = 1
返回 ["abc","adc"]
输入:
["abc", "abd", "abcd", "adc"]
"ac"
1
输出:
["abc","adc"]
解释:
“abc” 去掉 “b”
“adc” 去掉 “d”
样例 2:
输入:
["acc","abcd","ade","abbcd"]
"abc"
2
输出:
["acc","abcd","ade","abbcd"]
解释:
"acc" 把 "c" 变成 "b"
"abcd" 去掉 "d"
"ade" 把 "d" 变成 "b"把 "e" 变成 "c"
"abbcd" 去掉 "b" 和 "d"
Note
- 对编辑距离不熟悉的,可以参考 LeetCode 72. 编辑距离
超时代码
class Solution {
public:
int minDistance(string word1, string word2) {
// Use Vector<int>
vector<vector<int>> dp(word1.size() + 1, vector<int>(word2.size() + 1, 0));
for (int i = 0; i < dp.size(); i++) {
dp[i][0] = i;
}
for (int j = 0; j < dp[0].size(); j++) {
dp[0][j] = j;
}
for (int i = 1; i < dp.size(); i++) {
for (int j = 1; j < dp[i].size(); j++) {
dp[i][j] = min(dp[i - 1][j - 1], min(dp[i - 1][j], dp[i][j - 1])) + 1;
if (word1[i - 1] == word2[j - 1])
dp[i][j] = min(dp[i][j], dp[i - 1][j - 1]);
}
}
return dp.back().back();
}
vector<string> kDistance(vector<string> &words, string &target, int k) {
// write your code here
vector<string> ans;
for(auto w:words){
if(minDistance(w, target) <= k) ans.push_back(w);
}
return ans;
}
};
AC代码
class Solution {
public:
int minDistance(string word1, string word2) {
int n1 = word1.size();
int n2 = word2.size();
if(n1 == 0 || n2 == 0) return max(n1, n2);
int dp[n1+1][n2+1];
for (int i = 0; i <= n1; i++) {
dp[i][0] = i;
}
for (int j = 0; j <= n2; j++) {
dp[0][j] = j;
}
for (int i = 1; i <= n1; i++) {
for (int j = 1; j <= n2; j++) {
dp[i][j] = min(dp[i - 1][j - 1], min(dp[i - 1][j], dp[i][j - 1])) + 1;
if (word1[i - 1] == word2[j - 1])
dp[i][j] = min(dp[i][j], dp[i - 1][j - 1]);
}
}
return dp[n1][n2];
}
vector<string> kDistance(vector<string> &words, string &target, int k) {
// write your code here
vector<string> ans;
for(auto w:words){
if(minDistance(w, target) <= k) ans.push_back(w);
}
return ans;
}
};
性能实验代码
#include <time.h>
#include <stdio.h>
#include <vector>
#include <stdlib.h>
#include <iostream>
using namespace std;
int main(){
int maxn = 1000000;
clock_t start, finish;
double duration;
start = clock();
int a[maxn];
for(int i= 0; i < maxn; i ++) a[i] = i;
finish = clock();
duration = (double)(finish - start) / CLOCKS_PER_SEC;
cout << duration << endl;
start = clock();
vector<int> v;
for(int i = 0; i < maxn; i++) v.push_back(i);
finish = clock();
duration = (double)(finish - start) / CLOCKS_PER_SEC;
cout << duration << endl;
return 0;
}
实验结果
(base) LilideAir:CPP_basic lilisun$ ./a.out
0.008184
0.033609