leetcode324场周赛
一、使三个字符串相等
给你三个字符串 s1
、s2
和 s3
。 你可以根据需要对这三个字符串执行以下操作 任意次数 。
在每次操作中,你可以选择其中一个长度至少为 2
的字符串 并删除其 最右位置上 的字符。
如果存在某种方法能够使这三个字符串相等,请返回使它们相等所需的 最小 操作次数;否则,返回 -1
。
示例 1:
输入:s1 = "abc",s2 = "abb",s3 = "ab"
输出:2
解释:对 s1 和 s2 进行一次操作后,可以得到三个相等的字符串。
可以证明,不可能用少于两次操作使它们相等。
示例 2:
输入:s1 = "dac",s2 = "bac",s3 = "cac"
输出:-1
解释:因为 s1 和 s2 的最左位置上的字母不相等,所以无论进行多少次操作,它们都不可能相等。因此答案是 -1 。
提示:
1 <= s1.length, s2.length, s3.length <= 100
s1
、s2
和s3
仅由小写英文字母组成。
第一题老规矩就是个暴力模拟。上屎山:
class Solution {
public:
int findMinimumOperations(string s1, string s2, string s3) {
int ans = 0;
if(s1==s2 && s2 ==s3)
{
return ans;
}
int a = s1.size();
int b = s2.size();
int c = s3.size();
int temp = min(a,min(b,c));
if(s1[0] != s2[0] || s2[0]!=s3[0])
{
return -1;
}
for(int i=0;i<temp;i++) //相同几位
{
if(s1[i] == s2[i] && s2[i]==s3[i])
{
ans++;
}
else
{
break;
}
}
int x=0;
x+=a-ans;
x+=b-ans;
x+=c-ans;
return x;
}
};
二、区分黑球与白球
桌子上有 n
个球,每个球的颜色不是黑色,就是白色。
给你一个长度为 n
、下标从 0 开始的二进制字符串 s
,其中 1
和 0
分别代表黑色和白色的球。
在每一步中,你可以选择两个相邻的球并交换它们。
返回「将所有黑色球都移到右侧,所有白色球都移到左侧所需的 最小步数」。
示例 1:
输入:s = "101"
输出:1
解释:我们可以按以下方式将所有黑色球移到右侧:
- 交换 s[0] 和 s[1],s = "011"。
最开始,1 没有都在右侧,需要至少 1 步将其移到右侧。
示例 2:
输入:s = "100"
输出:2
解释:我们可以按以下方式将所有黑色球移到右侧:
- 交换 s[0] 和 s[1],s = "010"。
- 交换 s[1] 和 s[2],s = "001"。
可以证明所需的最小步数为 2 。
示例 3:
输入:s = "0111"
输出:0
解释:所有黑色球都已经在右侧。
提示:
1 <= n == s.length <= 105
s[i]
不是'0'
,就是'1'
。
脑子真的笨,这是一个思维题,只要累加每个0之前有几个一即可。例子:
详细分析:
因此这题脑子转过来就简单了,代码如下:
class Solution {
public:
long long minimumSteps(string s) {
long long ans = 0;
int cnt =0;
for(char c:s)
{
if(c == '1')
{
cnt++;
}
else
{
ans+=cnt;
}
}
return ans;
}
};
两题打卡下班。