java 字符串第一个_Java 返回字符串中第一个不重复字符的下标 下标从0开始

比如abcdefgabdef

其中字符c和g不重复,返回c的小标,下标从0开始,那么是2

package com.example.demo;

import org.testng.annotations.Test;

import java.util.ArrayList;

import java.util.LinkedHashSet;

public class Test111 {

String str1 = "abcdefgabdef";

@Test

public void fun1(){

//LinkedHashSet 有序的set集合

LinkedHashSet once = new LinkedHashSet<>();

LinkedHashSet chongFu = new LinkedHashSet<>();

ArrayList list = new ArrayList<>();

for (int i = 0; i < str1.length(); i++) {

boolean add = once.add(str1.charAt(i)); // 得到集合里所有出现过一次的元素

if (!add) {

chongFu.add(str1.charAt(i));// 得到集合里重复出现的元素

}

}

boolean removeAll = once.removeAll(chongFu); // once里将存储所有不重复的元素

list.addAll(once);

System.out.println("所有不重复的字母:" + list);

for (int i = 0; i < str1.length(); i++) {

if (list.get(0) == str1.charAt(i)) {

System.out.println("它的索引为:" + i);

}

}

}

@Test

public void fun2(){

ArrayList list = new ArrayList<>();

for (int i = 0; i < str1.length(); i++) {

int flag = -1;// 定义一个标志

for (int j = 0; j < str1.length(); j++) {

if (i == j) {// 如果是同一个元素跳过本次循环,继续下次循环

continue;

}

// 如果这个元素不是第一次出现,将标志改变

if (str1.charAt(i) == str1.charAt(j)) {

flag = 1;

}

}

// 未改变标志的元素,即只出现一次的元素

if (flag == -1) {

list.add(str1.charAt(i));

} // if

} // for

System.out.println("所有不重复的字母:" + list);

System.out.println("第一个不重复的字母为:" + list.get(0));

for (int i = 0; i < str1.length(); i++) {

if (list.get(0) == str1.charAt(i)) {

System.out.println("它的索引为:" + i);

}

}

}

@Test

public void fun3(){

for (int i = 0; i < str1.length(); i++) {

char charAt = str1.charAt(i);

// 找出取出的元素第一次出现的位置

int indexOf = str1.indexOf(charAt);

// 找出取出的元素最后一次出现的位置

int lastIndexOf = str1.lastIndexOf(charAt);

// 如果是唯一的元素,第一次出现的位置和最后一次出现的位置应该相同

// 如果相同了就没必要在继续走for循环了

if (indexOf == lastIndexOf) {

System.out.println(str1.charAt(indexOf));

System.out.println(indexOf);

return;

}

}

}

}

BF算法

BF算法,即Brute Force 算法的简称。用于检测某个字符串是否是另一个字符串的子串。

子串的概念#

假设字符串 X = 'girlfriend' , Y = 'friend' ,那么Y 就是 X的子串。同样的,end是friend的子串。

BF算法的思路#

BF算法的思路非常简单粗暴,就是从前到后一点点的匹配。例如: 子串 x= abcd | 主串为 y = abdabceabcde

如果 x[0] = y[0] 继续比较 x[1] y[1] 继续下去,如果一直到 x[3]= y[3]时 则 x 整个串都匹配上了。

如果 x[0] = y[0] 继续比较 x[1] y[i] 发现不等,那么就开始用 x[0] 比较 y[1] 然后继续 x[1] y[2]。

public class TestBF {

public static void main(String[] args) {

System.out.println(isSubstring("abdabceabcde","abcd")); // true

System.out.println(isSubstring("abdabceabcde","ff")); // false

}

private static boolean isSubstring(String main,String sub){

if(main == null || sub == null) {

return false;

}

if(main.length() < sub.length()) { // 子串不可比主串长

return false;

}

if(main.equals(sub)) { // 主串,子串 相等的情况

return true;

}

int len = main.length() - sub.length();

for (int i = 0; i < len; i++) {

boolean match = true;

for (int j = 0; j < sub.length(); j++) {

if(main.charAt(i+j) != sub.charAt(j)) {

match = false;

break;

}

}

if(match) {

return true;

}

}

return false;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值