1.重新排列单词间的空格
代码
class Solution {
public:
string reorderSpaces(string text) {
int N = text.length();
int cnt = 0;
for(int i=0;i<N;i++)
{
if(text[i]==' ')
cnt++;
}
istringstream ss(text);
vector<string> strs;
string s;
string ans;
while(ss>>s)
{
strs.push_back(s);
}
if(strs.size()<=1)
{
for(int i=0;i<cnt;i++)
{
s+=' ';
}
return s;
}
int avg = cnt/(strs.size()-1);
int remain = cnt%(strs.size()-1);
string spaces;
for(int i=0;i<avg;i++)
spaces += ' ';
for(int i=0;i<strs.size();i++)
{
if(i!=0)
ans += spaces;
ans += strs[i];
}
for(int i=0;i<remain;i++)
ans += ' ';
return ans;
}
};
2. 拆分字符串使唯一子字符串的数目最大
思路
回溯+哈希+剪枝
代码
class Solution {
public:
unordered_set<string> st;
int ans = 0;
void dfs(string& s, int pos)
{
if(s.length()-pos+st.size()<=ans) return;
if(pos==s.length())
{
ans = max(ans,(int)st.size());
return;
}
string temp;
for(int i=pos;i<s.length();i++)
{
temp += s[i];
if(st.find(temp)==st.end())
{
st.insert(temp);
dfs(s,i+1);
st.erase(temp);
}
}
}
int maxUniqueSplit(string s) {
dfs(s,0);
return ans;
}
};
3. 矩阵的最大负乘积
太蠢了,这么简单的个dp,我居然用搜索做。。
代码
typedef long long LL;
LL max(LL a, LL b, LL c, LL d)
{
return max(max(a,b),max(c,d));
}
LL min(LL a,LL b, LL c, LL d)
{
return min(min(a,b),min(c,d));
}
class Solution {
public:
const int MOD = 1e9+7;
int maxProductPath(vector<vector<int>>& grid) {
int N = grid.size();
int M = grid[0].size();
vector<vector<LL>> dp1(N+1, vector<LL>(M+1,1)); //最大值
vector<vector<LL>> dp2(N+1, vector<LL>(M+1,1)); //最小值
dp1[0][0] = dp2[0][0] = grid[0][0];
for(int i=1;i<N;i++)
dp1[i][0] = dp2[i][0] = dp1[i-1][0]*grid[i][0];
for(int j=1;j<M;j++)
dp1[0][j] = dp2[0][j] = dp1[0][j-1]*grid[0][j];
for(int i=1; i<N; i++)
{
for(int j=1; j<M; j++)
{
int g = grid[i][j];
dp1[i][j] = max(dp1[i-1][j]*g,dp1[i][j-1]*g,dp2[i][j-1]*g,dp2[i-1][j]*g);
dp2[i][j] = min(dp1[i-1][j]*g,dp1[i][j-1]*g,dp2[i][j-1]*g,dp2[i-1][j]*g);
}
}
if(dp1[N-1][M-1]<0)
return -1;
return dp1[N-1][M-1]%MOD;
}
};