-
java 字符串 子串_java字符串面试题,从一个字符串中查找子串
2021-03-22 14:12:36一个常规的字符串查找算法,两层循环,每次会记录之前匹配到的字串,完整匹配后程序会退出,如果要优化的话,需要使用KMP算法,大家可以百度,比较复杂。@RunWith(SpringRunner.class)@SpringBootTest@Slf4jpublic ...一个常规的字符串查找算法,两层循环,每次会记录之前匹配到的字串,完整匹配后程序会退出,如果要优化的话,需要使用KMP算法,大家可以百度,比较复杂。
@RunWith(SpringRunner.class)
@SpringBootTest
@Slf4j
public class findSubStringNormalTest {
@Test
public void run() {
String text = "xxb abbbb ccc add adddxdd";
String pat = "addd";
int matchlen = 0;
for (int i = 0; i < text.length(); i++) {
//外层循环控制目标文本偏移量
for (int j = 0; j < pat.length(); j++) {
//开始匹配
if (pat.charAt(j) == text.charAt(i + j)) {
matchlen++;
if (matchlen == pat.length()) {
log.info("final match :" + text.substring(i, i + j + 1));
break;
}
} else {
//记录每次匹配到的子串
if (matchlen > 0) {
log.info("match:" + text.substring(i, i + j + 1));
}
matchlen = 0;
break;
}
}
}
}
}
程序输出
com.example.findSubStringNormalTest : match:ab
com.example.findSubStringNormalTest : match:add
com.example.findSubStringNormalTest : final match :addd
-
java中字符串中的子串_Java中字符串中子串的查找共有四种方法(indexof())
2021-03-13 12:51:10Java中字符串中子串的查找共有四种方法(indexof())Java中字符串中子串的查找共有四种方法,如下:1、int indexOf(String str) :返回第一次出现的指定子字符串在此字符串中的索引。2、int indexOf(String str, int ...Java中字符串中子串的查找共有四种方法(indexof())
Java中字符串中子串的查找共有四种方法,如下:
1、int indexOf(String str) :返回第一次出现的指定子字符串在此字符串中的索引。
2、int indexOf(String str, int startIndex):从指定的索引处开始,返回第一次出现的指定子字符串在此字符串中的索引。
3、int lastIndexOf(String str) :返回在此字符串中最右边出现的指定子字符串的索引。
4、int lastIndexOf(String str, int startIndex) :从指定的索引处开始向后搜索,返回在此字符串中最后一次出现的指定子字符串的索引。
indexof()用法说明
indexof()
返回 String 对象内第一次出现子字符串的字符位置。
string.indexOf(subString[, startIndex])
参数
string
必选项。String 对象或文字。
subString 必选项。
要在 String 对象中查找的子字符串。
starIndex 可选项。
该整数值指出在 String 对象内开始查找的索引。如果省略,则从字符串的开始处查找。
说明
indexOf 方法返回一个整数值,指出 String 对象内子字符串的开始位置。如果没有找到子字符串,则返回-1。
如果 startindex 是负数,则 startindex 被当作零。如果它比最大的字符位置索引还大,则它被当作最大的可能索引。
从左向右执行查找。否则,该方法与 lastIndexOf 相同。
示例
下面的示例说明了 indexOf 方法的用法。
function IndexDemo(str2){
var str1 = "BABEBIBOBUBABEBIBOBU"
var s = str1.indexOf(str2);
return(s);
}
public classFirstDemo {
/***API中String的常用方法
*/
//查找指定字符串是否存在
public static voidmain(String[] args) {
String str1 = "abcdefghijklmnabc";
//从头开始查找是否存在指定的字符
System.out.println(str1.indexOf("c"));
//从第四个字符位置开始往后继续查找
System.out.println(str1.indexOf("c", 3));
//若指定字符串中没有该字符则系统返回-1
System.out.println(str1.indexOf("x"));
}
-
java字符串最长公共子串_两个字符串的最长公共子串)(Java)
2021-03-11 10:21:26import java.util.Collections;import java.util.HashMap;...public class H25b{/*** @查找两个字符串a,b中的最长公共子串*/public static String getLCS(String a,String b){if (a.contains(b))return b;if ...import java.util.Collections;
import java.util.HashMap;
import java.util.Scanner;
public class H25b
{
/**
* @查找两个字符串a,b中的最长公共子串
*/
public static String getLCS(String a,String b)
{
if (a.contains(b))
return b;
if (b.contains(a))
return a;
int length1 = a.length() , length2 = b.length();
String min = length1 <= length2? a:b;
String max = length1 > length2? a:b;
int lengthmin = min.length();
for (int j = lengthmin ; j > 0 ; j--)
{
for (int i = 0 ;i <= lengthmin-j ; i++)
{
if (max.contains( min.substring(i, i+j)) )
return min.substring(i, i+j);
}
}
return "";
}
public static void main(String[] args)
{
Scanner cin = new Scanner(System.in);
String a = cin.next();
String b = cin.next();
cin.close();
System.out.println( getLCS(a,b) );
}
}
-
java 查找子串算法_Java 中字符串的子串搜索
2021-02-28 09:30:56基友前两天参加了阿里的实习生面试,问了个问题,就是关于字符串的子串搜索的问题。想想实现方式无非就是两层循环,但是 java 中是有现成实现的,于是我就去查查源码,看看 java 语言怎么实现这个的,发现也就是...基友前两天参加了阿里的实习生面试,问了个问题,就是关于字符串的子串搜索的问题。想想实现方式无非就是两层循环,但是 java 中是有现成实现的,于是我就去查查源码,看看 java 语言怎么实现这个的,发现也就是差不多的意思。
java.lang 包中 String 类 有几个 indexOf() 函数,我要寻找的是 indexOf(String str) 这个的具体实现,发现了
public int indexOf(String str) {
return indexOf(str, 0);
}
然后 F3 继续找,public int indexOf(String str, int fromIndex) {
return indexOf(value, offset, count, str.value, str.offset, str.count,
fromIndex);
}这个调用应该就是算法的实现了,继续 F3
/**
* Code shared by String and StringBuffer to do searches. The source is the
* character array being searched, and the target is the string being
* searched for.
*
* @param source
* the characters being searched.
* @param sourceOffset
* offset of the source string.
* @param sourceCount
* count of the source string.
* @param target
* the characters being searched for.
* @param targetOffset
* offset of the target string.
* @param targetCount
* count of the target string.
* @param fromIndex
* the index to begin searching from.
*/
static int indexOf(char[] source, int sourceOffset, int sourceCount,
char[] target, int targetOffset, int targetCount, int fromIndex) {
if (fromIndex >= sourceCount) {
return (targetCount == 0 ? sourceCount : -1);
}
if (fromIndex < 0) {
fromIndex = 0;
}
if (targetCount == 0) {
return fromIndex;
}
char first = target[targetOffset];
int max = sourceOffset + (sourceCount - targetCount);
for (int i = sourceOffset + fromIndex; i <= max; i++) {
/* Look for first character. */
if (source[i] != first) {
while (++i <= max && source[i] != first)
;
}
/* Found first character, now look at the rest of v2 */
if (i <= max) {
int j = i + 1;
int end = j + targetCount - 1;
for (int k = targetOffset + 1; j < end
&& source[j] == target[k]; j++, k++)
;
if (j == end) {
/* Found whole string. */
return i - sourceOffset;
}
}
}
return -1;
}
注意这个函数是静态函数,是String and StringBuffer公用的一个工具方法,具体算法原理代码中很显而易见。
又查阅了一些资料,目前子串搜索的方法有下面几种,
KMP算法, BM算法,Sunday算法
其中无论是简单程度还是效率排序均为下面:
Sunday > BM > KMP
Sunday 算法的核心思想如下(转自百度百科):
字符串模式匹配中超越BF、KMP和BM的算法
sunday算法的概念如下:
Sunday算法是Daniel M.Sunday于1990年提出的一种比BM算法搜索速度更快的算法。其核心思想是:在匹配过程中,模式串并不被要求一定要按从左向右进行比较还是从右向左进行比较,它在发现不匹配时,算法能跳过尽可能多的字符以进行下一步的匹配,从而提高了匹配效率。
假设在发生不匹配时S[i]≠T[j],1≤i≤N,1≤j≤M。此时已经匹配的部分为u,并假设字符串u的长度为L。如图1。明显的,S[L+i+1]肯定要参加下一轮的匹配,并且T[M]至少要移动到这个位置(即模式串T至少向右移动一个字符的位置)。
图1 Sunday算法不匹配的情况
分如下两种情况:
(1) S[L+i+1]在模式串T中没有出现。这个时候模式串T[0]移动到S[T+i+1]之后的字符的位置。如图2。
图2 Sunday算法移动的第1种情况
(2)S[L+i+1]在模式串中出现。这里S[L+i+1]从模式串T的右侧,即按T[M-1]、T[M-2]、…T[0]的次序查找。如果发现S[L+i+1]和T中的某个字符相同,则记下这个位置,记为k,1≤k≤M,且T[k]=S[L+i+1]。此时,应该把模式串T向右移动M-k个字符的位置,即移动到T[k]和S[L+i+1]对齐的位置。如图3。
图3 Sunday算法移动的第2种情况
依次类推,如果完全匹配了,则匹配成功;否则,再进行下一轮的移动,直到主串S的最右端结束。该算法最坏情况下的时间复杂度为O(N*M)。对于短模式串的匹配问题,该算法执行速度较快。
Sunday算法思想跟BM算法很相似,在匹配失败时关注的是文本串中参加匹配的最末位字符的下一位字符。如果该字符没有在匹配串中出现则直接跳过,即移动步长= 匹配串长度+1;否则,同BM算法一样其移动步长=匹配串中最右端的该字符到末尾的距离+1。
现举个例子来说明:
比如:
匹配串:abcbczdxzc
模式串:zbcac
这里我们看到b-a没有对上,我们就看匹配串中的z在模式串的位置,然后对齐。
匹配串:abcbczdxzc
模式串: zbcac
如果模式串中的没有那个字符的话就跳过去。
匹配串:abcbcedxzcs
模式串:zbcac
e不在模式串中出现,那么我们就
匹配串:abcbcedxzcs
模式串: zbcac
附一个Sunday算法的 C++ 实现(原文链接:http://hi.baidu.com/azuryy/item/8a50f54a2f8c72e51381dad3)
/* Sunday.h */
class Sunday
{
public:
Sunday();
~Sunday();
public:
int find(const char* pattern, const char* text);
private:
void preCompute(const char* pattern);
private:
//Let's assume all characters are all ASCII
static const int ASSIZE = 128;
int _td[ASSIZE] ;
int _patLength;
int _textLength;
};
源文件
/* Sunday.cpp */
Sunday::Sunday()
{
}
Sunday::~Sunday()
{
}
void Sunday::preCompute(const char* pattern)
{
for(int i = 0; i < ASSIZE; i++ )
_td[i] = _patLength + 1;
const char* p;
for ( p = pattern; *p; p++)
_td[*p] = _patLength - (p - pattern);
}
int Sunday::find(const char* pattern, const char* text)
{
_patLength = strlen( pattern );
_textLength = strlen( text );
if ( _patLength <= 0 || _textLength <= 0)
return -1;
preCompute( pattern );
const char *t, *p, *tx = text;
while (tx + _patLength <= text + _textLength)
{
for (p = pattern, t = tx; *p; ++p, ++t)
{
if (*p != *t)
break;
}
if (*p == 0)
return tx-text;
tx += _td[tx[_patLength]];
}
return -1;
}
简单测试下:
int main()
{
char* text = "blog.csdn,blog.net";
char* pattern = "csdn,blog" ;
Sunday sunday;
printf("The First Occurence at: %d\n",sunday.find(pattern,text));
return 1;
}
注,上述算法中数组_td[],是用于记录 pattern 中每个字符的位置
-
java 母串中找子串_java查找字符串中的包含子字符串的个数实现代码
2021-03-08 07:24:04} 以上这篇java查找字符串中的包含子字符串的个数实现代码就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持PHP中文网。 更多java查找字符串中的包含子字符串的个数实现代码相关文章请... -
java 母串中找子串_【转】Java中字符串中子串的查找共有四种方法(indexof())
2021-03-08 07:23:18原文网址:http://wfly2004.blog.163.com/blog/static/1176427201032692927349/Java中字符串中子串的查找共有四种方法,如下:1、int indexOf(String str) :返回第一次出现的指定子字符串在此字符串中的索引。... -
java 字符串 子串_Java中字符串中子串的查找共有四种方法
2021-03-05 20:57:451.int indexOf(String str):返回第一次出现的指定字符串在此字符中的索引。2.int indexOf(String str,...3.int lastIndexOf(String str):返回在此字符串中最右边出现的指定字符串的索引。4.int lastIndexOf(String ... -
java indexof 子字符串_java查询字符串的子串的用法:indexOf()
2021-02-27 21:23:40Java查找字符串中的子串共有四种方法,如下:1、int indexOf(String str) :从在向右查找,返回指定子字符串在此字符串中第一次出现的索引位置。(索引从0开始)2、int indexOf(String str, int startIndex):从指定的... -
JAVA 字符串三个常用操作(查找子串、截取字符串、分割字符串)
2019-05-16 17:42:00public int indexOf(int ch ) :返回指定字符在字符串中第一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1。 或 public int indexOf(int ch, int fromIndex) :返回从 fromIndex 位置开始查找指定字符在... -
java 字符串查找_Java字符串地查找操作
2021-02-12 09:23:44在一个字符串中查找字符或子串是经常使用的操作。String类提供了两种查找字符串的方法,分别是indexOf()和lastIndexOf(),这两种方法都返回待查找字符或子串在字符串的起始索引位置。int indexOf(String s)该方法... -
查找字符串中相同连续字符串最多的子串,如果有两串长度相同取asc码 例如1233455 中是33
2019-11-04 20:56:47package test; import java.util.ArrayList; import java.util.HashMap; import java.util.List;...// 查找字符串中相同连续字符串最多的子串,如果有两串长度相同取asc码 例如1233455 中是33 /* 思路:... -
java 字符串首字母大写 查找子串所在的位置
2018-10-23 19:39:511. 统计该字符串中字母c出现的次数 2. 求该字符串的逆 3. 输出该字符串中子串str的所有位置(无需考虑子串叠加现象) 4. 将字符串中每个单词的第一个字母变成大写并输出 import java.lang.*; import java.util.*;... -
Java 字符串 提取子串,记录子串出现的次数
2020-12-15 17:01:03字符串问题中,常出现的查找字符串在一指定字符串中出现的次数,可以用contains()函数解答。其代码如下: int num = 0; while (res.contains(s)) { res = res.substring(res.indexOf(s) + s.length()); num++;... -
java查询字符串的子串的用法:indexOf()
2017-07-18 14:40:00Java查找字符串中的子串共有四种方法,如下:1、int indexOf(String str) :从在向右查找,返回指定子字符串在此字符串中第一次出现的索引位置。(索引从0开始)2、int indexOf(String str, int startIndex):从指定... -
统计字符串中某子串的出现的次数
2010-05-12 15:15:12[code="java"]public double getCount(String str, String sign) { ... // 查找某一字符串中str,特定子串sign的出现次数 if (str == null) return 0; double i = str.length(); str = str.re... -
string查找子串失败返回值_Java中字符串中子串的查找共有四种方法(indexof())
2020-12-29 09:21:34Java中字符串中子串的查找共有四种方法,如下:1、int indexOf(String str) :返回第一次出现的指定子字符串在此字符串中的索引。2、int indexOf(String str, int startIndex):从指定的索引处开始,返回第一次出现... -
字符串找子串java算法_java – 用于在字符串中搜索子字符串的快速算法
2021-03-13 08:57:22我想要一个有效的算法(或库),我可以使用在Java中搜索字符串中的子字符串。我想做的是:给定一个输入字符串 – INSTR:“BCDEFGH”和一组候选字符串 – CAND:“AB”, “CDE”, “FG”, “H”, “IJ”查找与INSTR中... -
华为机试---字符串中所有子串的集合
2014-08-30 13:53:58package huawei; import java.util.Iterator; import java.util.Scanner; import java.util.Set;... * 功能描述:查找一个字符串的子字符串集 * 输入:abab 输出:a b ab ba aba bab * @author USER * * -
Java——在一个字符串中查找一个子串,计算出来这个子串在字符串中出现的次数。
2018-07-16 15:36:06引入包:import java.util.Scanner; main函数: public static void main(String[] args){ ...Scanner s = new Scanner(System.in)...请输入字符串"); String strIn= s.nextLine(); System.out.println(... -
java 在一个字符串中查找最大对称子串
2015-01-27 13:23:15public class Symmetry { public static void main(String[] arg0){ String string="rogkoqgrrrogole"; boolean flag=false; for(int i=string.length();;i--){ ...if(Symmetry.judge(string.su -
Java实现:查找子串在字符串中出现的次数
2012-03-31 10:22:16* @param source 查找的源字符串 * @param target 目标子串 * @return number of target string in source */ public static int stringFind(String source, String target){ int number = 0; int i = ... -
java string查找子串_java – 查找给定字符串的每个可能的子集
2021-03-09 00:50:20Memory efficient power set algorithm5个我试图在Java中找到每个可能的字符串字符串 – 我的意思是,如果我有一个4个字符长的单词,我想要从它派生的所有可能的3个字符长单词,所有2个字符长,所有1性格长.我最直接的... -
java实现:查找字符串中最长回文子串 ---- leetCode notes
2018-06-07 11:04:17Given a string s, find the longest palindromic substring... 提供一个字符串s,找出其最长的回文子串 所谓的回文子串就是正序反序均一直的字符串,当然也可以这样理解: 选定字符串s,以其中轴为中心线,然后左右... -
java 忽略大小写查找子串_我们如何检查字符串在Java中是否包含子字符串(忽略大小写)?...
2021-02-28 14:59:15String类的contains()方法接受Sting值作为参数,验证当前String对象是否...查找字符串是否包含特定的子字符串,而不管大小写如何-获取字符串。获取子字符串。使用toLowerCase()方法将字符串值转换为小写字母,并将其... -
Java学习 查找两个字符串中的最大子串
2018-06-22 09:51:11public static String getMaxSubString(String str1,String str2) { String max = null,min = null;...str2.length()) //先区分出大串和小串 { max = str1; min = str2; } else ... -
[Java]练习:查找两个字符串的最大相同子串
2020-06-23 11:50:24本文旨在提供一种思路和现成的代码来解决提取两个字符串中最大相同子串的问题(可能不止一个)。 -
JAVA代码—算法基础:给定一个字符串查找最长回文子串
2018-01-28 13:07:27给定一个字符串查找最长回文子串 输入一个字符串,求出其中最长的回文子串。 子串的含义是:在原串中连续出现的字符串片段。 回文的含义是:子串从左向右看和从右向左看是相同的,例如:abba,yyxyy。 在判断...