最终我还是失败了。没写出来
题干:给定一个二进制字符串 S(一个仅由若干 ‘0’ 和 ‘1’ 构成的字符串)和一个正整数 N,如果对于从 1 到 N 的每个整数 X,其二进制表示都是 S 的子串,就返回 true,否则返回 false。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-string-with-substrings-representing-1-to-n
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
示例 1:
输入:S = “0110”, N = 3
输出:true
示例 2:
输入:S = “0110”, N = 4
输出:false
这个题我抓住了三点进行写步骤:
- 找到字符串的子字符串
- 数字转换为二进制
- 二进制和子字符串比较
就是这三点:很庆幸的是,我会面向百度编程。
也参考了另一位大佬的java代码:
class Solution {
public boolean queryString(String S, int N) {
for(int i=1;i<=N;i++){
String bin=Integer.toBinaryString(i);
if(S.indexOf(bin)==-1) return false;
}
return true;
}
}
非常谢谢这位大佬
我也发现了java和C#语法非常像。
比如:String bin=Integer.toBinaryString(i);
和string bin = Convert.ToString(i, 2);
以及:S.indexOf(bin)
和S.Contains(bin)
这两行和一个判断就大致组成了这个题的答案。剩下的就是部分循环和输出了。
下面是我写的C#:
public bool QueryString(String S, int N)
{
bool[] IsTrue = new bool[N];
IsTrue[0] = true;
for (int i = 1; i < N; i++)
{
string bin = Convert.ToString(i, 2);
//将int类型转换成二进制存入bin中
if (S.Contains(bin))
{
IsTrue[i] = true;
}
else
{
IsTrue[i] = false;
}
}
for (int i = 0; i < IsTrue.Length; i++)
{
if (IsTrue[i] == false)
{
return false;
}
}
return true;
}
而为什么和java的比这么长呢,只因为一句话:
indexOf 方法返回一个整数值,指出 String 对象内子字符串的开始位置。如果没有找到子字符串,则返回-1。
好了好了,又改了改,发现自己真傻
public bool QueryString(String S, int N)
{
int b = 1;
for (int i = 1; i < N+1; i++)
{
string bin = Convert.ToString(i, 2);
//将int类型转换成二进制存入bin中
if (S.Contains(bin) == false)
{
b = 2;
}
}
if (b == 2)
{
return false;
}
else
{
return true;
}
}
可以根据这个思想直接判断是否为一个值啊。和上文的java判断是否为-1一样。
还有一点是,上面有一个N+1。这也是调试过程中发现的。
当输入N=4的时候,运行还是true。我通过调试发现,它根本加不到4,只能加到三。
这也和for循环的执行顺序有关for (int i = 1; i < N; i++)
下面随便写一个方法,看就知道了
static void Main(string[] args)
{
Program program = new Program();
//Console.WriteLine(program.QueryString("0110", 3));
program.qwe(4);
}
public int qwe(int N)
{
for (int i = 0; i < N; i++)
{
Console.WriteLine(i);
}
return 2;
}
执行结果为:
你会发现和本题的题目不符,一到N。就是1,2,3,4。
而现在的循环执行不到4。
所以更改如下:for (int i = 0; i < N+1; i++)
其实刚才我还憨憨的用
do——while。其实也行。
其实刚才出了个bug,就是在
在最后一个测试用例的时候,内存超了。哎,因为一点点小事,都看到了可以用-1来判断,
但是我还是用来
bool[] IsTrue = new bool[N];
IsTrue[0] = true;
for (int i = 0; i < IsTrue.Length; i++)
{
if (IsTrue[i] == false)
{
return false;
}
}
非常消耗内存的,繁琐的。哎。
我崩溃了,超出时间限制啊啊啊啊。
我去寻找更厉害的算法了。我还会回来征服这道题的。