LOADING

加载过慢请开启缓存 浏览器默认开启

2023/11/6

每日一题(重复的字符串)+java学习

459.重复的子字符串

力扣题目链接(opens new window)

给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。

示例 1:

  • 输入: “abab”
  • 输出: True
  • 解释: 可由子字符串 “ab” 重复两次构成。

示例 2:

  • 输入: “aba”
  • 输出: False

示例 3:

  • 输入: “abcabcabcabc”
  • 输出: True)
  • 解释: 可由子字符串 “abc” 重复四次构成。 (或者子字符串 “abcabc” 重复两次构成。)
//重复的子字符串
// Created by 徐昊岩 on 2023/11/6.
//想到关键的一点:只会由子字符串构成2、3...有限次,因此一定是长度的1/2或1/3...,其实很简单
/*  判断质数、公约数.....都可以用到
 * 首先,约数是成对出现的。比如24,你找到个约数3,那么一定有个约数8,因为24/3=8
 * 然后,这对约数必须一个在根号n之前,一个在根号n之后。因为都在根号n之前的话,乘积一定小于n(根号nX根号n=n),
 * 同样,都在根号n之后的话,乘积一定大于n。所以,如果你在根号n之前都找不到约数的话,那么根号n之后就不会有了。
 */

#include "string"
#include "cmath"
#include "iostream"
using namespace std;

class Solution {
public:
    bool repeatedSubstringPattern(string s) {
        int size = s.size();
        if(size==1) return false;  //长度1没有子串,算错...
        string son1(size,s[0]);
        if(s==son1) return true;
        for (int i = 2; i < size/2+1; i++) {
            if(size%i==0){
                string son;
                for(int o=0;o<size/i;o++) son+=s.substr(0,i);  //substr截取子串:参数一是起始索引,参数二是长度
                if(son==s) return true;
            }
        }
        return false;
    }
};

class Solution2 {
public:
    bool repeatedSubstringPattern(string s) {
        string t = s + s;
        t.erase(t.begin()); t.erase(t.end() - 1); // 掐头去尾
        if (t.find(s) != std::string::npos) return true; // r
        return false;
    }
};

class Solution3 {
public:
    void getNext (int* next, const string& s){
        next[0] = -1;
        int j = -1;
        for(int i = 1;i < s.size(); i++){
            while(j >= 0 && s[i] != s[j + 1]) {
                j = next[j];
            }
            if(s[i] == s[j + 1]) {
                j++;
            }
            next[i] = j;
        }
    }
    bool repeatedSubstringPattern (string s) {
        if (s.size() == 0) {
            return false;
        }
        int next[s.size()];
        getNext(next, s);
        int len = s.size();
        if (next[len - 1] != -1 && len % (len - (next[len - 1] + 1)) == 0) {
            return true;
        }
        return false;
    }
};
int main(){
    Solution3 s3;
    string s="asdfasdfasdf";
    int next[s.size()];
    s3.getNext(next,s);
    for(int i=0;i<s.size();i++){
        cout<<next[i];
    }
}

java学习 UDP编程

package web_programing;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class UDP_client {
    public static void main(String[] args) throws IOException {
        /*
        客户端创建DatagramSocket实例时并不需要指定端口,而是由操作系统自动指定一个当前未使用的端口。
        紧接着,调用setSoTimeout(1000)设定超时1秒,意思是后续接收UDP包时,等待时间最多不会超过1秒,否则在没有收到UDP包时,客户端会无限等待下去。
        这一点和服务器端不一样,服务器端可以无限等待,因为它本来就被设计成长时间运行。
         */
        DatagramSocket ds=new DatagramSocket();
        ds.setSoTimeout(1000);
        ds.connect(InetAddress.getByName("localhost"),8081);  //还不能直接指定代理字符串,这里的连接不是长时间挂起的连接状态,而只是指定一个目标Socket
        byte[] data = "WATER".getBytes();
        DatagramPacket packet = new DatagramPacket(data, data.length);
        ds.send(packet);
        byte[] buffer = new byte[1024];
        packet = new DatagramPacket(buffer, buffer.length);
        ds.receive(packet);
        String resp = new String(packet.getData(), packet.getOffset(), packet.getLength());
        System.out.println(resp);
        ds.disconnect();
// 关闭:
        ds.close();
    }
}