A.重新排列单词间的空格

解题思路:
模拟。统计空格数以及单词数。
代码展示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
class Solution {
public:
string reorderSpaces(string text) {
int k = 0, n = text.size(), i;
string t = "";
vector<string> word;
for(i=0;i<n;i++){
if(text[i]==' ') k++;
else{
t += text[i];
break;
}
}
for(++i;i<n;i++){
if(text[i] == ' '){
k++;
if(t!="") {
word.push_back(t);
t = "";
}
}else{
t += text[i];
}
}
if(t!="") word.push_back(t);
int w = word.size();
string ans = "";
ans += word[0];
if(w == 1){
for(int i=0;i<k;i++){
ans += " ";
}
}else{
for(int i=1;i<w;i++){
for(int j=0;j<k/(w-1);j++)
ans+=" ";
ans += word[i];
}
for(int j=0;j<k%(w-1);j++)
ans += " ";
}
return ans;
}
};

B.拆分字符串使唯一子字符串的数目最大

解题思路:
暴力枚举。递归搜索每一种情况。
代码展示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#define mmax(x,y) (x)>(y)?(x):(y)
class Solution {
public:
int ans = 0,n;
string s;
unordered_map<string,int> dic;
int maxUniqueSplit(string s) {
this->s = s;
n = s.size();
dfs(0);
return ans;
}
void dfs(int t){
if(t == n){
ans = mmax(ans,dic.size());
}
string tmp = "";
for(int i=t;i<n;i++){
tmp += s[i];
if(!dic.count(tmp)){
dic[tmp]+=1;
dfs(i+1);
dic.erase(tmp);
}
}
}
};

C.矩阵的最大非负积

解题思路:
递归。枚举所有情况,遇到0剪枝。
代码展示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

#define mmax(x,y) (x)>(y)?(x):(y)
class Solution {
public:
typedef long long ll;
static const ll mod = 1e9+7;
ll ans = -1;
int r,c;
int grid[16][16];
int maxProductPath(vector<vector<int>>& grid) {
r = grid.size(), c = grid[0].size();
for(int i=0;i<r;i++)
for(int j=0;j<c;j++) this->grid[i][j] = grid[i][j];
dfs(0,0,1);
return ans % mod;
}
void dfs(int i,int j,ll k){
if(i == r || j == c) return ;
if(!grid[i][j]){
ans = mmax(ans,0);
return ;
}
k = k * grid[i][j];
if(i == r-1 && j == c-1){
ans = mmax(ans,k);
return ;
}
dfs(i+1,j,k);
dfs(i,j+1,k);
}
};

做题情况:
AC 三题
排名:428 / 4115
总结反思:
做的很差,二三题都不难,卡了有点久。