1016.子串能表示从 1 到 N 数字的二进制串

最终我还是失败了。没写出来

题干:给定一个二进制字符串 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

这个题我抓住了三点进行写步骤:

  1. 找到字符串的子字符串
  2. 数字转换为二进制
  3. 二进制和子字符串比较

就是这三点:很庆幸的是,我会面向百度编程

也参考了另一位大佬的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;
                }
            }

非常消耗内存的,繁琐的。哎。

我崩溃了,超出时间限制啊啊啊啊。在这里插入图片描述

我去寻找更厉害的算法了。我还会回来征服这道题的。

发布了13 篇原创文章 · 获赞 0 · 访问量 659

猜你喜欢

转载自blog.csdn.net/Somewater_/article/details/103987456