5483. 整理字符串
- 大小写英文字母组成的字符串 s
- 一个整理好的字符串中
- s[i] 是小写字符,但 s[i + 1] 是相同的大写字符;反之亦然 。
- 将字符串整理好,每次你都可以从字符串中选出满足上述条件的 两个相邻 字符并删除,直到字符串整理好。
class Solution {
public:
string makeGood(string s) {
int len= s.size();
stack <char> st;
st.push(s[0]);
for (int i=1;i<len;i++)
{
char temp=s[i];
if(st.empty())
st.push(temp);
else
{
char top = st.top();
if(top-temp == 32 || temp-top==32)
{
st.pop();
}
else
{
st.push(temp);
}
}
}
string result;
while(!st.empty())
{
char temp = st.top();
result=result+temp;
st.pop();
}
reverse(result.begin(),result.end());
return result;
}
};
- 沃特玛还用什么栈啊
- 直接用一个string好了。
5484. 第N 个二进制字符串中的第 K 位
- 二进制字符串 Sn 的形成规则如下:
- S1 = “0”
- 当 i > 1 时,Si = Si-1 + “1” + reverse(invert(Si-1))
S1 = “0”
S2 = “011”
S3 = “0111001”
S4 = “011100110110001”
- 还是得益于C++里面的string啊
- 不然要累死了
class Solution {
public:
void invert(string &s)
{
for (int i=0;i<s.size();i++)
{
if(s[i]=='0')
s[i]='1';
else
s[i]='0';
}
}
char findKthBit(int n, int k) {
string s="0";
int len=1;
while(len<=k)
{
string temp = s;
invert(temp);
reverse(temp.begin(),temp.end());
s=s+"1"+temp;
len = len *2+1;
}
return s[k-1];
}
};
第三题
- 超时了
class Solution {
public:
bool isfind(vector<int>& nums,int start,int end,int target)
{
int sum=0;
for (int i=end;i>=start;i--)
{
sum+=nums[i];
if(sum==target)
return true;
}
return false;
}
int maxNonOverlapping(vector<int>& nums, int target) {
int *temp2 = new int [nums.size()];
for (int i=0;i<nums.size();i++)
{
temp2[i]=-1;
}
int result=0;
if(nums[0] == target)
{
temp2[0]=0;
result++;
}
for (int i=1;i<nums.size();i++)//一定要包含第i个数
{
if(isfind(nums,temp2[i-1]+1,i,target))
{
result++;
temp2[i]=i;
}
else
temp2[i]=temp2[i-1];
}
for (int i=0;i<nums.size();i++)//一定要包含第i个数
{
cout << temp2[i]<<endl;
}
return result;
}
};