每日一题(重复的字符串)+java学习
459.重复的子字符串
给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过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();
}
}