首页 > 试题广场 >

字符串指定字符反转

[编程题]字符串指定字符反转
  • 热度指数:529 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解

给定两个字符串,将中的包含在中的字符翻转。

示例1

输入

"abcde","bcd"

输出

"adcbe"

说明

将'b','c','d'翻转 
示例2

输入

"acbde","dc"

输出

"adbce"

说明

将'c','d'翻转 

备注:




分享一个简单的思路,代码贴上,大家一看就懂

import java.util.*;
public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param s1 string字符串 
     * @param s2 string字符串 
     * @return string字符串
     */
    public String reverse (String s1, String s2) {
        // write code here
        int left = 0;
        int right = s1.length()-1;
        char[] s1Char = s1.toCharArray();
        while(left<right) {
            while (!s2.contains(String.valueOf(s1Char[left]))) {
                ++left;
            }
            while (!s2.contains(String.valueOf(s1Char[right]))) {
                --right;
            }
            char temp = s1Char[left];
            s1Char[left] = s1Char[right];
            s1Char[right] = temp;
            ++left;
            --right;
        }
        return String.valueOf(s1Char);
    }
}
发表于 2022-05-03 13:02:51 回复(0)
 public String reverse (String s1, String s2) {
        // write code here
        String str="";
        Stack<Character> sks1=new Stack<>();
        int start=0;
        int end=s1.length()-1;
        char[] charS1=s1.toCharArray();
        while(start<end){
            if(s2.contains(String.valueOf(charS1[start]))){
                sks1.add(charS1[start]);
            }else{
                start++;
                continue;
            }
            if(s2.contains(String.valueOf(charS1[end]))){
                if(!sks1.isEmpty()){
                    char temp=charS1[end];
                    charS1[end]=sks1.pop();
                    charS1[start]=temp;
                    start++;
                    end--;
                }
            }else{
                end--;
            }
        }
        str=new String(charS1);
    return str;
    }

代码基本上就是4479的那个,不过他有部分不太对,我改了一下。

发表于 2021-09-18 15:21:58 回复(0)
这题有问题dc 只要含有字母都能互换 那是不是说 含有dc 和cd的都能互换
还得加限制条件是否从左到右
如abcddc 结果应该是 abdccd
还有个问题就是  abcdefg_efdcb bcdef  是不是说 bcdef efdcb这都得符合
还得加限制条件是否从左到右
bcdefg_efdcbg bcdef 结果应该是 fedcbg_bcdfeg

发表于 2023-12-02 13:10:12 回复(0)
publicString reverse (String s1, String s2) {
        // write code here
        char[] arr1=s1.toCharArray();
        char[] arr2=s2.toCharArray();
        char[] temp= newchar[arr2.length];
        for(intj=0;j<arr2.length;j++){
           temp[arr2.length-1-j]=arr2[j];
        }
        StringBuilder s =newStringBuilder();
        for(inti=0;i<arr1.length;i++){
            for(intj=0;j<arr2.length;j++){
                if(arr1[i]==arr2[j]){
                    arr1[i]=temp[j];
                    break;
                }
            }
            s.append(arr1[i]);
        }
        returns.toString();
    }

为什么不对 
发表于 2022-02-23 17:51:32 回复(0)
public String reverse (String s1, String s2) {
        // write code here
        char[] charS1=s1.toCharArray();
        List<Integer> index=new ArrayList();
        List<Character> str=new ArrayList();
        for(int i=0;i<s1.length();i++){
            for(int j=0;j<s2.length();j++){
                if(charS1[i]==s2.charAt(j)){
                    index.add(i);
                    str.add(charS1[i]);
                }
            }
        }
        Collections.reverse(str);
        for(int i=0;i<index.size();i++){
            charS1[index.get(i)]=str.get(i);
        }
        String a=new String(charS1);
        return a;
    }

发表于 2022-01-21 13:43:18 回复(0)
public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param s1 string字符串
     * @param s2 string字符串
     * @return string字符串
     */
    public String reverse (String s1, String s2) {
        // write code here
        char[] s1_arr = s1.toCharArray();
        char[] s2_arr = s2.toCharArray();
 
        ArrayList<Integer> keys = new ArrayList<>();
 
        for (int i = 0; i < s1_arr.length; i++) {
            for (int j = 0; j < s2_arr.length; j++) {
                if (s1_arr[i] == s2_arr[j]) {
                    keys.add(i);
                }
            }
        }
         
        //keys里面是s1中包含在s2中的字符的索引
        //升序排列
        Collections.sort(keys);
 
        int left = 0;
        int right = keys.size() - 1;
        while (left < right) {
            char temp = s1_arr[keys.get(right)];
            s1_arr[keys.get(right)] = s1_arr[keys.get(left)];
            s1_arr[keys.get(left)] = temp;
            left++;
            right--;
        }
 
        return String.valueOf(s1_arr);
    }
}

发表于 2022-01-15 18:33:06 回复(0)
class Solution {
public:
    string reverse(string s1, string s2) {
        unordered_set<char> us;
        for (char c : s2)
            us.insert(c);
        vector<int> indices;
        int n = s1.size();
        for (int i = 0; i < n; ++i)
            if (us.count(s1[i]) > 0)
                indices.push_back(i);
        int m = indices.size();
        int i = 0, j = m - 1;
        while (i < j) {
            swap(s1[indices[i]], s1[indices[j]]);
            ++i;
            --j;
        }
        return s1;
    }
};
发表于 2022-01-15 12:57:00 回复(0)
期待最优解

    private String test3(String s1,String s2){

        Stack<Character> charactersStack = new Stack<>();

        char[] s1Char = s1.toCharArray();

        int start = 0 ;
        int end = s1Char.length - 1;

        while (start < end){

            if (s2.contains(String.valueOf(s1Char[start]))){
                charactersStack.add(s1Char[start]);
            }else{
                start++;
                continue;
            }

            if (s2.contains(String.valueOf(s1Char[end]))){
                if (charactersStack.isEmpty()){
                    start++;
                    continue;
                }else {
                    char index  = s1Char[end];
                    s1Char[end] = charactersStack.pop();
                    s1Char[start] = index;
                    start++;
                    end--;
                }
            }else {
                end--;
            }
        }
        return new String(s1Char);
    }


编辑于 2021-08-26 21:12:30 回复(2)
用例在哪里啊
发表于 2021-07-28 17:13:09 回复(0)
双指针,也写得不优雅,希望大神给出简单优雅的方法
import java.util.*;
import java.util.HashSet;
import java.util.Set;
 
public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param s1 string字符串
     * @param s2 string字符串
     * @return string字符串
     */
    public String reverse (String s1, String s2) {
        // write code here
         // write code here
        Set<Character> hashSet=new HashSet<>();
        char[] c1=s1.toCharArray();
        char[] c2=s2.toCharArray();
        for (char c : c2) {
            hashSet.add(c);
        }
        int l=0,r=c1.length-1;
        while (l<r){
            while (!hashSet.contains(c1[l])){
                l++;
            }
            while (!hashSet.contains(c1[r])){
                r--;
            }
            char temp=c1[l];
            c1[l]=c1[r];
            c1[r]=temp;
            l++;
            r--;
        }
        return String.valueOf(c1);
    }
}

发表于 2021-06-30 20:51:09 回复(0)
感觉自己做的非常繁琐....有大神能给出简单方法就好了
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param s1 string字符串 
     * @param s2 string字符串 
     * @return string字符串
     */
    public String reverse (String s1, String s2) {
        // write code here
        char[] c2 = s2.toCharArray();
        Set<Character> set = new HashSet<>();
        for(Character c : c2){
            set.add(c);
        }
        //判断c1字符串中有哪几个索引对应的字符是包含在s2中的
        char[] c1 = s1.toCharArray();
        List<Integer> list = new ArrayList<>();
        for(int i = 0; i < c1.length; i++){
            if(set.contains(c1[i])){
                list.add(i);
            }
        }
        //将存储需要反转的索引的集合变成数组
        Integer[] array = list.toArray(new Integer[list.size()]);
        //用双指针进行反转
        int left = 0;
        int right = array.length-1;
        while(left < right){
            char temp = c1[array[right]];
            c1[array[right]] = c1[array[left]];
            c1[array[left]] = temp;
            left++;
            right--;
            
        }
        return new String(c1);  
    }
}


发表于 2021-06-28 15:55:30 回复(0)